我在PHP中使用Crypt()来加密密码。
让我们说盐是“bg”,
密码是:“gg456456gg”
加密结果给出:“bgvQk9C2Pv27o”
但是,如果我使用密码:“gg456456” - 没有最后两个字符,它会给出相同的结果。
因此,用户无需输入100%准确密码即可登录。
发生了什么事?我的意思是gg456456和gg456456gg是两个不同的密码,为什么加密结果相同?
答案 0 :(得分:3)
标准的基于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。