Php “a”的好处是什么;“随机”;在“a”上撒盐;独特的;盐?

Php “a”的好处是什么;“随机”;在“a”上撒盐;独特的;盐?,php,security,passwords,hash,phpass,Php,Security,Passwords,Hash,Phpass,我目前正在编写一个程序,其中一部分涉及安全地创建密码散列以存储在数据库中,我偶然发现了这个框架,这似乎是极力推荐的。在phpass中,它们似乎花费了大量的时间来产生一种尽可能真实随机的盐,用于散列(例如从/dev/uradom读取) 我的问题是,与简单地使用uniqid()相比,这样做有什么好处?这难道不是简单地确保用于散列的盐彼此不同而不是随机的吗?使用真正随机的salt是否会比使用唯一的salt更糟糕,因为它可能会产生碰撞,而uniqid()不会 编辑:我的问题不是关于计算机环境中是否存在“

我目前正在编写一个程序,其中一部分涉及安全地创建密码散列以存储在数据库中,我偶然发现了这个框架,这似乎是极力推荐的。在phpass中,它们似乎花费了大量的时间来产生一种尽可能真实随机的盐,用于散列(例如从/dev/uradom读取)

我的问题是,与简单地使用
uniqid()
相比,这样做有什么好处?这难道不是简单地确保用于散列的盐彼此不同而不是随机的吗?使用真正随机的salt是否会比使用唯一的salt更糟糕,因为它可能会产生碰撞,而uniqid()不会


编辑:我的问题不是关于计算机环境中是否存在“真正的”随机性,所以我可能有点用错了措辞,但我的问题更多的是关于“更多”是否存在随机salt比salt更具唯一性有任何好处。

我认为这无关紧要,因为salt还必须与散列密码一起存储,因此攻击者无论如何都会获得salt,攻击将是相同的,无论您是如何生成salt的

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


编辑-讨论结论salt在破解密码所需的时间上有很大的不同,但不要使用md5()对密码进行哈希运算!使用非常慢的散列函数,如bcrypt(),或者,如果需要使用md5(),请多次调用它

我试图找到一些利用漏洞的先例的参考资料(而且很难找到!),但与uniqid()产生的随机值相反的加密随机盐的想法是帮助防止通过密文对加密方案的攻击。由伪随机数生成器生成的具有可预测模式(如唯一ID)的salt从密文中去除了一些可变性,当然,在密码学中,不可预测性是您所寻找的


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

迈克,正如我在另一个回答中所说,我认为这不是盐的问题,但如果你真的关心真/伪随机性,你可以使用random.org上的数字。 ,a和。

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

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

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
这意味着我们有64个不同的字符用于一个22个字符长的salt,计算得出大约5.44e+39个不同的组合


因此,从根本上说,在试图使某个事物独一无二的过程中,它实际上没有使用随机源那么独特。

使用随机源会更好吗?物理学家们对宇宙是否从根本上具有确定性存在分歧。在知道这一点之前,没有什么可以被认为是真正随机的。撇开哲学不谈,所有随机数生成算法都是伪随机的。用外部熵(如CPU的温度或麦克风发出的声音)将它们植入,可以使它们看起来更随机,但它们仍然不是真正随机的。@Dan:我想说这与“哲学除外”相反!从所有的意图和目的来看,外部熵源是完全不可预测的,因此与随机性一样好。有些人认为世界从根本上来说是确定的,这意味着这些熵源是完全可预测的,宇宙中发生的一切都是可预测的——给定一个已知的状态,您可以为所有未来状态建模。这就是哲学。“把哲学放在一边”,意思是“把它放在一边”或“忽略它”,然后我们同意,你可以使用外部熵使RNG更随机,不管它是否真的随机。Dan,我相信这足以成为一个答案+1看不到盐的好处是。。。糟糕。盐不是用来防御字典攻击的。除了一个合适的密码策略(及其强制执行)之外,几乎没有什么可以抵御字典攻击的了。Salt的目的是使预计算的哈希->密码映射(最著名的是彩虹表)不可行,迫使攻击者对他们想要破解的每个密码进行更多的工作——当然,假设,您有我刚才提到的密码策略。Salt和加密密钥的目的是使匹配或解码所涉及的计算工作变得昂贵,而不是无限未知。Salt产生了巨大的差异,您不必将其与密码一起存储。通过使用盐,你可以击败简单的彩虹攻击。慢平均