我为我的网站设置了一个登录/注册脚本,我正在使用md5来加密我的密码,我只是设置了一个更改密码部分,但是我注意到我只能在包含字母数字时更改我的密码。例如,如果我的旧密码是stack123,我将其更改为overflow123,它将完美地工作。但是,如果我将它从堆栈123更改为堆栈!它不会和我猜测这是因为在这种情况下的感叹号。任何人都可以向我解释为什么会这样吗?
答案 0 :(得分:-2)
不要使用MD5。你应该使用hash_hmac()或更好的新PHP Hashing API(如果你至少有PHP 5.5)。为了使密码更安全,使用随机生成的,为每个用户提供不同的盐(它只是一个充满随机字符的字符串)并将其与密码保存在数据库中。
这是一个生成随机字符串的函数($ length确定返回字符串的长度):
function generate($length) {
$dummy = array_merge(range('0', '9'), range('a', 'z'), range('A', 'Z'));
shuffle($dummy);
return substr(implode('', $dummy), 0, $length);
}
这是PHP Hashing API的代码片段:
function my_password_hash($salt, $password) {
$phpapi_options = array("algo" => PASSWORD_BCRYPT, "salt" => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM), "cost" => 11);
return password_hash(sha1($salt.$password), $phpapi_options['algo'], $phpapi_options);
}
function my_password_verify($salt, $password, $hash) {
return password_verify(sha1($salt.$password), $hash);
}
my_password_hash()生成给定salt和密码的哈希值。 my_password_verify()使用您存储在数据库中的哈希验证给定的密码(用户输入)和salt(来自数据库)。
这是一个带有hash_hmac()的代码片段:
function my_password_hash($salt, $password) {
$hash_key = ""; //define a 10 characters long random generated string here (it has to be always the same)
if(empty($hash_key)) {
die('You must enter a valid hash key.');
}
return hash_hmac("sha512", sha1($salt.$password), $hash_key);
}
function my_password_verify($salt, $password, $hash) {
if($hash == my_password_hash($salt, $password)) {
return true;
} else {
return false;
}
}
我希望这有点帮助,如果没有,或者你有任何问题,请问。