我使用PHP的crypt()函数在存储到数据库之前加密密码。现在如果密码包含数字,则所有具有相同子字符串的密码都会生成相同的加密。例如,以下所有密码都会生成相同的加密。
echo crypt('abcdefg123','mykey').'<br>';
echo crypt('abcdefg123','mykey').'<br>';
echo crypt('abcdefg123456','mykey').'<br>';
加密密码结果为
myeWT99Ku6TaM
我做错了什么?还是一个bug?
答案 0 :(得分:2)
crypt
函数将salt
作为第二个参数。 salt
具有here所述的特殊格式
您提供的salt
被识别为标准DES 算法。
标准的基于DES的crypt()返回salt作为输出的前两个字符。 它也只使用str的前八个字符,因此以相同的八个字符开头的较长字符串将产生相同的结果(当使用相同的盐时)。
提供适当的盐。例如,尝试使用MD5:
echo crypt('abcdefg123','$1$mykeyabcd$').'<br>';
echo crypt('abcdefg123','$1$mykeyabcd$').'<br>';
echo crypt('abcdefg123456','$1$mykeyabcd$').'<br>';
答案 1 :(得分:0)
我认为这是因为盐。 默认情况下,你可以在crypt函数中使用 CRYPT_STD_DES 哈希类型,这种类型适用于两个字符salt,但你使用5个字符salt。
在salt中使用无效字符会导致crypt()失败。 http://php.net/manual/ru/function.crypt.php