若基字符串只有细微的变化,则函数PHP:crypt()返回相同的字符串


PHP: crypt() function returns same string if base string has only slight variation

我在使用crypt时遇到问题。我正在为一个客户重建一个网站。因此,有很多从以前版本继承的代码。我必须保持网站原始数据库的策略,所以我必须小心更改代码。以前的开发人员使用crypt()函数创建用户密码的哈希值以进行存储。我看到的奇怪效果是,同一密码的微小变化有时会产生完全相同的哈希。我不太了解地下室是如何工作的,但在我看来,这不应该发生。下面是一些代码作为示例。

echo crypt('Colliedog6','wfd')."'n";
echo crypt('Colliedog10','wfd')."'n";

这将在我的服务器上返回相同的哈希字符串。我之所以使用这个salt字符串,是因为之前的开发人员使用了这个字符串,而所有当前密码都是使用该salt字符串创建的,所以我真的需要使用它,除非我们想强制所有用户重置密码。这不一定是不可能的,但我们希望避免它。为什么crypt会像上面那样使用两个稍微不同的字符串,并创建相同的哈希?

来自文档:

标准的基于DES的crypt()将salt作为输出的前两个字符返回。它也只使用str的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的salt时)。

因为crypt()忽略超过第8位的字符。和往常一样,阅读PHP手册/docs是一个很好的起点——在PHP中有很多类似的gotcha:http://php.net/manual/en/function.crypt.php