PHP的Crypt()精度损失?相同的盐,不同的密码=相同的加密结果

时间:2015-01-03 14:52:39

标签: php hash cryptography

我在PHP中使用Crypt()来加密密码。 让我们说盐是“bg”,
密码是:“gg456456gg”

加密结果给出:“bgvQk9C2Pv27o”
但是,如果我使用密码:“gg456456” - 没有最后两个字符,它会给出相同的结果。

因此,用户无需输入100%准确密码即可登录。

发生了什么事?我的意思是gg456456和gg456456gg是两个不同的密码,为什么加密结果相同?

2 个答案:

答案 0 :(得分:3)

Php.net on function crypt()

  

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

因此请使用不同的加密方法。 如河豚或沙512。这些将接受更长的字符串

E.g。 SHA-512:

$encpassword = crypt($password,"$6$".$salt);

使用上面的方法(和相同的盐):

gg456456 - > $ 6 $ $六三一零八零六六一L2o7HNKfYrqB4H19vYe7fRWWLenQj2EcWqriNG9rX6ki1QKO2YytkylrYmZ8mhIr6XE19Ms4RW2of5Z / dsYRA /

gg456456gg - > $ 6 $ $六三一零八零六六一maGxQ2d7ZIPIdXDFN1sJJsIjTFEwD9dL / uljSXdKXeJU4E5miCzh1ZCao57sGDm9PrDhdPYPLGUvoy0HzTfqI。

为您的盐使用一个好的随机数生成器,并且您有一个加密密码

答案 1 :(得分:1)

Unix系统上的原始crypt函数仅使用密码的前8个字符。最终我们认为这是不安全的,并已切换到更安全的密码哈希。

PHP crypt函数根据您提供的salt选择要使用的算法,并且您使用的两个字符的字母数字盐触发原始的crypt算法。

有关算法和各种盐的列表,请参阅http://php.net/manual/en/function.crypt.php