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

Mik*_*ike 5 php security passwords hash phpass

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

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

编辑:我的问题不是关于计算机环境中是否存在“真正的”随机性,所以也许我用词不当,但是我的问题更接近于“更多”随机盐是否比更多独特性有任何好处作为盐。

Mik*_*ike 0

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

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

ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
Run Code Online (Sandbox Code Playgroud)

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

所以基本上,在试图创造出独特的东西时,它实际上不如使用随机源时那么独特。