“随机”盐比“独特”盐有什么好处?

时间:2011-08-13 00:37:21

标签: php security passwords hash phpass

我目前正在编写一个程序,其中一部分涉及安全地创建密码哈希以存储在数据库中,我遇到了phpass框架,这似乎是强烈推荐的。在phpass中,他们似乎花了很大的力气来制作一种尽可能真正随机的盐用于散列(例如从/ dev / urandom读取)。

我的问题是,与简单地使用uniqid()相比,这样做有什么好处?仅仅是为了确保用于散列的盐是不同的而不是随机的?不会使用真正的随机盐实际上比使用独特的盐更糟,因为它可能会产生碰撞而uniqid()不会?

编辑:我的问题不在于计算机环境中是否存在“真正的”随机性,所以也许我对它进行了一些改编,但我的问题更多的是“更多”随机盐是否有任何益处作为盐更加独特。

4 个答案:

答案 0 :(得分:1)

我试图找到一些漏洞利用先例的参考(并且正在努力!),但是加密随机盐的概念与uniqid()生成的随机值相反,是为了帮助防止攻击通过密文的加密方案。具有可预测模式的盐 - 例如唯一ID - 由伪随机数生成器生成,从密文中获取一些可变性,当然,在密码学中,不可预测性就是你所拥有的寻找。

当然,如果您选择的框架(即.NET中的RNGCryptoServiceProvider)可以使用加密安全的随机数生成器,那么您可以选择更可预测的模式。我会看看我是否能找到一些好的先例或白皮书。

答案 1 :(得分:0)

在PHP中,uniqid()函数根据当前时间计算其结果。这有助于确保值是唯一的,因为没有两次出现两次,但是这不适用于多个服务器,因为它纯粹是基于时间的。使用基于时间的东西是不好的,因为uniqid()可以产生的不同值的数量非常有限。假设PHP已经使用了25年,计算结果为7.89e + 14微秒,因此uniqid()的值将相同。

这是一个非常大的数字,但假设我们能够获得真正的随机盐,碰撞的可能性实际上远远小于使用uniqid()时。可以用作盐的可能字符是:

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

这意味着我们有64个不同的字符用于22个字符长的盐,计算大约5.44e + 39种不同的组合。

所以基本上,在尝试创造一些独特的东西时,它实际上 唯一比使用随机源时唯一

答案 2 :(得分:-1)

迈克,正如我在另一个答案中所说,我不会认为这是盐的问题,但如果你真的关心真/伪随机性,你可以使用来自random.org的数字。 See the difference,a和see how to get true random number in PHP

答案 3 :(得分:-9)

我认为这并不重要,因为盐必须与散列密码一起存储,所以攻击者无论如何都会获得盐,攻击将是相同的,无论你怎么生成盐。

(OT讨论:我认为我没有看到使用salt存储密码的巨大优势 - 一旦攻击者获得特定哈希密码的盐,他无论如何都可以进行字典攻击......它会更慢,因为攻击者必须为每个密码盐重新编写字典,但是...... md5()速度快,如果攻击需要5分钟或半天,那真正的区别是什么......我觉得盐不太安全比没有。)

编辑 - 讨论结论盐在破解密码所需的时间差异很大,但不要使用md5()来散列密码!使用非常慢的散列函数,如bcrypt(),或者,如果你需要使用md5(),请调用它数千次!

相关问题