无论哪种方式,以下代码都会返回相同的加密密码。我们为什么以及如何阻止这种情况。
$pwd = 'shits8888';
$salt = '50153fc193af9';
echo crypt($pwd,$salt)
显然缺少一些东西,因为这是返回相同的东西
$pwd = 'shits8888hjhfgnsdkjf8744884';
$salt = '50153fc193af9';
echo crypt($pwd,$salt)
基于标准 DES 的 crypt() 将 salt 作为输出的前两个字符返回。它也只使用 str 的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的盐时)。
http://php.net/manual/en/function.crypt.php
如果您想更好地控制用于哈希的算法,我建议您看一下mcrypt。
还要注意crypt()
(尽管有名称)实际上并没有加密字符串,它只是生成一个哈希。如果你指定盐,你可能也存储在某个地方,你可能会用这样的东西做得更好:
function my_crypt ($string, $salt) {
return sha1($string.$salt); // ...or your hashing function of choice
}
从手册中引用:基于标准 DES 的 crypt() 将 salt 作为输出的前两个字符返回。它也只使用 str 的前八个字符,因此以相同八个字符开头的较长字符串将生成相同的结果(当使用相同的盐时)。
两个条目都有相同的前 8 个字符和相同的盐。所以它必须返回相同的结果。
例如:
echo crypt('12345678xxxxx','50153fc193af9');
echo crypt('12345678yyyyyy','50153fc193af9');
都会返回50gyRGMzn6mi6
,因为它们共享相同的盐和相同的前 8 个字符
每个加密算法都有一个限制,即使 md5 在某些时候重复。