“随机”盐相比“唯一”盐有什么好处?

5
我正在编写一个程序, 其中的一部分涉及安全地创建密码散列以存储在数据库中。我发现 phpass 框架似乎得到了高度推荐。在 phpass 中,它们似乎非常努力地生成尽可能真正随机的盐用于哈希(例如从 /dev/urandom 读取)。
我的问题是,这样做有什么好处呢,与简单地使用 uniqid() 相比呢?点不是确保用于哈希的盐互不相同而不是随机吗?使用真正随机的盐是否实际上比使用唯一的盐更糟糕,因为它可能会产生碰撞,而 uniqid() 则不会?
编辑:我的问题并不是关于计算机环境中是否存在“真正”的随机性,所以也许我表达不够准确,然而我的问题更多的是关于“更”随机的盐是否比更唯一的盐有任何优势。

2
它是否更适合于http://crypto.stackexchange.com/? - Can Poyrazoğlu
4
物理学家对宇宙是否根本上是确定性的存在争议。在这一点没有被确定之前,任何事情都不能被认为是真正的随机。撇开哲学不谈,所有随机数生成算法都是伪随机的。通过添加外部熵(如CPU温度或来自麦克风的声音)可以让它们看起来更随机,但它们仍然不是真正的随机。 - Dan Grossman
2
@丹:我会说这与“撇开哲学”恰好相反!就所有意图和目的而言,外部熵源是完全不可预测的,因此与随机一样好。 - Oliver Charlesworth
4
有些人认为世界根本是确定性的,这意味着那些源可以被完美地预测,就像宇宙中发生的其他事情一样——在已知状态下,你可以模拟所有未来的状态。那是哲学观点。“撇开哲学观点”,意思是“不考虑那个”,或者“忽略那个”,然后我们都同意,你可以使用外部熵来使随机数产生器“更随机”,无论它是否真正随机。 - Dan Grossman
1
丹,我相信这已经足够成为一个答案了。+1 - Delan Azabani
显示剩余5条评论
4个回答

1

我正在尝试寻找一些攻击先例的参考资料(并且很困难!),但是使用密码学上的随机盐而不是像uniqid()函数产生的随机值,可以帮助防止通过密文对加密方案进行攻击。由伪随机数生成器生成的具有可预测模式(例如唯一ID)的盐会减少密文的某些变化性,当然,在密码学中,不可预测性是你要寻找的。

当然,如果在您选择的框架中提供了密码学安全的随机数生成器(例如.NET中的RNGCryptoServiceProvider),您应该选择这种方法而不是更可预测的模式。我将看看是否能找到一些关于此的好先例或白皮书。


0
在PHP中,uniqid()函数基于当前时间计算其结果。这有助于确保值是唯一的,因为没有两个时间会发生两次,但由于它纯粹是基于时间的,所以在多个服务器之间无法使用。使用基于时间的东西是不好的,因为uniqid()可以产生的不同值的数量非常有限。假设PHP已经使用了25年,那么已经过去了7.89e+14微秒,因此uniqid()产生的相同数量的值将被生成。
这是一个非常大的数字,但是假设我们能够获得真正随机的盐,与使用uniqid()相比,发生冲突的几率实际上要小得多。可以用作盐的可能字符是:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/

这意味着我们有64个不同的字符可以用来构造一个22个字符长的盐值,这对应大约5.44e+39种不同的组合。

所以基本上,试图制作独特的东西时,实际上比使用随机源要独特。


-1

-9

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

(OT讨论:我认为在存储密码时使用盐没有太大优势-一旦攻击者获得特定哈希密码的盐,他仍然可以进行字典攻击...它会更慢,因为攻击者必须为每个密码盐重新计算哈希值,但是..md5()非常快,如果攻击需要5分钟或半天,真正的区别是什么...我觉得使用盐并不比不使用盐更安全。)

编辑-讨论结论盐对于破解密码所需的时间有很大影响,但不要使用md5()来哈希密码!使用非常缓慢的哈希函数,例如bcrypt(),或者如果您需要使用md5(),则调用它数千次!


5
看不到盐的好处是...不好的。 - deceze
2
盐并不是用来防御字典攻击的。除了良好的密码策略(以及对其的执行),几乎没有什么能够防御字典攻击。盐的目的是使预先计算的哈希->密码映射(最著名的是彩虹表)变得不可行,迫使攻击者为每个要破解的密码进行更多的工作——当然,前提是您有我刚提到的那个密码策略。 - cHao
1
盐和加密密钥的目的是使匹配或解码所涉及的计算工作变得昂贵,而不是无限未知。 - Jared Farrish
1
好吧,你也不会使用MD5进行密码哈希。这正是因为它很快。如果必须使用,请至少将其拉伸几千次。有许多技术需要一起使用才能使存储密码安全(其中“安全”意味着“对攻击者来说足够难以突破,使其变得不可行”)。你没有使用任何一个,因为在你的看法中,每个单独的技术都不值得?抱歉,但你应该再次被点踩。 - deceze
1
@Tomas,我从来没有提到md5,如果你检查一下我在问题中提到的库,你会发现它使用bcrypt,比md5慢得多,并且通过相应地增加成本参数来有意地减慢速度。md5不应该用于密码哈希处理。 - Mike
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接