我一直在寻找一个生成随机数的算法,这个算法必须是安全的。
我将使用这个算法生成一个将在PBKDF2中使用的salt。
通过我的阅读,我发现艾萨克是一个快速的算法,比RC4更好,但在安全性方面不是很好。另外,我还想到了算法,但也有文章说它效率不高.
哪一种算法对PBKDF2盐的生成既安全又合理?
发布于 2012-02-25 12:34:07
因为目标是为PBKDF2生成salt,所以不需要高效(如快速)随机生成器: PBKDF2是(有意的)计算密集型的。此外,在PBKDF2的许多用途中(例如,存储密码),盐被生成一次、存储并多次重复使用,从而进一步降低了对盐生成效率的关注。俗话说:过早优化是万恶之源。
在这种用法中,您也不需要精确的均匀分布(例如在赌场机器中使用的随机生成器就是这样)。RC4的(极小的)偏倚在盐的生成中并不是一个关注的问题。
在这种情况下,到目前为止最重要的标准是,生成器产生相同值两倍的可能性很低。正如RSA密钥生成背景下的最新轶事 (也是这里更新)所示,这是很难正确实现的,特别是论网络家电。基本问题是,如果输入相同的输入,任何确定性RNG的不同运行(如RC4或艾萨克)都会产生相同的结果。因此,重要的是生成器的种子材料,以及是否/如何在运行期间保存它的状态。
生成器的两个不重复的简单实现如下
请注意,这两种方法都假设一个实例正在运行,并且如果攻击者能够影响系统(重置持久整数,更改时钟设置.),则可能会中断。当然,这些发电机是可预测的,而不是随机发电机。但是假设单个秘密随机种子密钥的可用性,这是很容易修复的:给定不重复的生成器的输出N,输出HMAC(Key,N)。
实用的软件RNGs结合了以下几种技术收集的种子材料:启动后CPU时钟、进程时间、启动时的RAM内容、硬盘和网络延迟、鼠标位置、键盘按键及其定时、硬盘和网卡中的硬件序列号。
有关软件RNGs的理想属性和设计的更多深入讨论,请参见亚罗。有关物理设计和测试,请参见例如可测试随机比特发生器的设计。
发布于 2012-02-24 22:30:56
如果您要为PBKDF2生成salt,那么您实际上并不关心效率(因为通过设计对PKBKD2的评估本身是相当昂贵的)。
此外,密码盐没有很高的安全要求。我们真的不在乎某人是否能够区分一个有效的盐值和一个随机值。我们真正关心的是,两个人不太可能得到同样的盐,提前预测盐值也是非常重要的。RC4和艾萨克都满足了这些要求。
另一方面,如果您正在为任何与安全有关的事情生成随机数,我个人建议您查看在NIST SP 800-90中找到的随机数生成器(除了Dual_EC_DRBG);它们是由那些知道自己在做什么的人设计的,而且它们可以满足您的需要。唯一需要担心的是熵收集(对于任何随机数生成器,您都必须担心这个问题)。是的,他们为你所需要的东西而过分;然而,过度杀戮并不一定是一件坏事。
发布于 2012-02-25 01:50:10
当人们需要随机数的时候,最大的错误不是他们使用了像RC4这样的半体面的prf,而是他们没有用足够的熵来播种它。如果您选择使用包含新熵的128位种子的RC4,以及NIST 800-90的最新实现,并通过对rand函数构建的几次调用来实现NISTSP800-90,那么您最好使用一个适当的种子RC4。
https://crypto.stackexchange.com/questions/1925
复制相似问题