我正在尝试使用PHP crypt()创建一个基本的密码哈希/验证方案。我现在无法升级到PHP 5.5.0,所以我不能使用password_hash()和password_verify()。
我的代码如下:
function myinit_salt()
{
$options = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
for ($i = 0; $i <= 20; $i ++) {
$options = str_shuffle ( $options );
$salt .= $options [rand ( 0, 63 )];
}
return $salt;
}
(注册时加密用户提供的密码)。。。
$salt = myinit_salt();
$blowfish = '$2a$10$';
$enc_pw = crypt($userinput['password'], $blowfish . $salt);
(将加密密码存储在数据库中)。。。
(在尝试登录时根据用户提供的密码验证存储的密码)。。。
function verify_password($input_password, $db_password)
{
if ($input_password) {
if (crypt($input_password, $db_password) == $db_password) {
//authenticated
return true;
} else return false;
} else return false;
}
即使用户提供的密码匹配,也会返回false。所以我让verify_password()吐出它正在使用的值,这就是给出的值:
用户提供的密码($input_password)=abcxyz123
$db_password=$2a$10$y/WXEmlCb6392Wpf8FMpq.FuwwnaSU51x/xPdFYlTl5y6Bsn51Nzi
verify_password()密码散列=$2a$10$y/WXEmlCb6392Wpf8FMpq.s8Y6lrJGDMOAJ4d8GffQUEiAWKsEqS
因此,看起来salt匹配,但由于某种原因,密码哈希不匹配。
有人能透露一些信息吗?谢谢
您的myinit_salt
中有两个错误
function myinit_salt()
{
$options = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789./';
$salt = ''; // without it notice would be raised
// v
for ($i = 0; $i <= 21; $i ++) { // <--- length of salt should be 22
// ^
$options = str_shuffle ( $options );
$salt .= $options [rand ( 0, 63 )];
}
return $salt;
}
http://php.net/manual/en/function.crypt.php
附言:为什么不使用php扩展密码?
p.S.S.不要创建自己的盐生成函数。str_shuffle
-对于密码函数是不安全的。mt_rand
。最好在已经实现salt生成的地方使用密码扩展。
verify_password()
函数中生成的哈希值生成一个有效的BCrypt哈希,该哈希值具有与存储的哈希值相同的参数和盐。这实际上只留下了另一种选择,即输入是不同的$userinput['password'] != $input_password
。
无论如何,您很可能可以使用新的password_hash()函数,我建议您这样做。有一个兼容包可用于PHP 5.3.7及更高版本。即使使用5.3,也可以在进行小改动的情况下使用它。