我正在尝试使用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()crypt hash = $ 2a $ 10 $ y / WXEmlCb6392Wpf8FMpq.s8Y6lrJGDMOAJ4d8GffQUEiAWKsEyqS
因此看起来盐匹配,但密码哈希由于某种原因不匹配。
任何人都能解开一些光明吗?感谢。
答案 0 :(得分:0)
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
P.S。为什么不使用password php扩展名?
P.S.S。不要创建自己的盐生成功能。 str_shuffle
- 对于crypt函数不安全。 mt_rand
也是。最好在已经实现盐生成的情况下使用密码扩展。
答案 1 :(得分:0)
verify_password()
函数中生成的哈希值生成一个有效的BCrypt哈希值,该哈希值与存储的哈希值具有相同的参数和相同的salt。这实际上只留下了替代方案,输入是不同的$userinput['password'] != $input_password
。
无论如何,你很可能会使用新的password_hash()函数,我建议你这样做。 PHP版本5.3.7及更高版本可以使用compatibility pack。即使使用5.3,也可以使用较小的改动。