【发布时间】:2013-11-21 21:11:34
【问题描述】:
我在阅读 PHP 中的密码安全性时偶然发现了一个有趣的说法:
将密码的哈希值作为盐的哈希值返回相同的哈希值
没有多想,我继续php.net,发现它说的是同样的事情。
我们来看一个例子:
crypt("test", "test"); -> teH0wLIpW0gyQ
crypt("test", "teH0wLIpW0gyQ"); -> teH0wLIpW0gyQ
我完全可以理解 PHP 中的 crypt 会生成给定字符串的单向哈希。
- 我不明白的是,我们如何使用两种完全不同的盐获得相同的哈希输出?
- 这是否意味着可能有其他盐可以给我相同的哈希值?
跟进
谢谢大家的指点。我现在可以看到默认行为是只使用 salt 的前两个字符,这完全回答了我所有的问题。感觉很傻,但是……
【问题讨论】:
-
由于鸽巢原理,#2 的答案是肯定的。这几乎会影响基于哈希构建的所有内容,并且在设计良好的系统中不是问题,因为没有输入生成相同的哈希是可以猜测或找出的。
-
#1 的答案是:它取决于加密算法。这个问题没有普遍的答案。我不知道
crypt函数的基本工作原理,但即使我知道,我也怀疑它会是一个简短的答案;-) -
一般来说,是的;可能有不止一种盐会给出相同的哈希值,但是对于一个运行良好的网站,这不应该是一个值得关注的主要原因
-
阅读手册,它都在那里:“基于标准 DES 的哈希,带有来自字母“./0-9A-Za-z”的两个字符盐。”
标签: php security hash passwords