【发布时间】:2014-09-30 18:37:50
【问题描述】:
我正在尝试使用 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.s8Y6lrJGDMOAJ4d8GffQUEiAWKsEyqS
所以看起来盐匹配,但密码哈希由于某种原因不匹配。
谁能解释一下?谢谢。
【问题讨论】: