我需要了解这个功能的基础知识.对于blowfish算法,php.net文档指出:
Blowfish hashing with a salt as follows: “$2a$”, a two digit cost parameter, “$”, and 22 base 64 digits from the alphabet “./0-9A-Za-z”. Using characters outside of this range in the salt will cause crypt() to return a zero-length string
因此,根据定义,这不应该起作用:
echo crypt('rasmuslerdorf', '$2a$07$usesomadasdsadsadsadasdasdasdsadesillystringforsalt$');
然而,它吐出:
$2a$07$usesomadasdsadsadsadaeMTUHlZEItvtV00u0.kb7qhDlC0Kou9e
看来crypt()已将盐本身切成22的长度.有人可以解释一下吗?
我无法理解这个功能的另一个方面是当他们使用crypt()来比较密码时. http://php.net/manual/en/function.crypt.php(见前#1).这是否意味着如果我使用相同的盐来加密所有密码,我必须首先加密它?即:
$salt = "usesomadasdsadsadsadae";
$salt_crypt = crypt($salt);
if (crypt($user_input, $salt) == $password) {
// FAIL WONT WORK
}
if (crypt($user_input, $salt_crypt) == $password) {
// I HAVE TO DO THIS?
}
谢谢你的时间
解决方法:
以下代码示例可能会回答您的问题.
要使用Blowfish生成散列密码,首先需要生成一个salt,它以$2a $开头,后跟迭代计数和22个字符的Base64字符串.
$salt = '$2a$07$usesomadasdsadsadsadasdasdasdsadesillystringfors';
$digest = crypt('rasmuslerdorf', $salt);
将整个$digest存储在数据库中,它包含salt和digest.
比较密码时,只需这样做,
if (crypt($user_input, $digest) == $digest)
您正在重复使用摘要作为盐. crypt知道算法标识符中的salt有多长.