Md5对某些字符不起作用


md5 doesnt work with certain characters

我已经为我的网站设置了一个登录/注册脚本,我使用md5加密我的密码,我刚刚设置了一个更改密码部分,但是我注意到我只能在包含字母数字时更改密码。例如,如果我的旧密码是stack123,我把它改为overflow123,它会完美地工作。但是如果我把它从堆栈123改为堆栈!它不会,我猜这是因为在这种情况下的感叹号。有人能给我解释一下为什么会这样吗?

不使用MD5。您应该使用hash_hmac()或者更好的是新的PHP哈希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哈希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()为给定的盐和密码生成哈希。My_password_verify()使用存储在数据库中的散列验证给定的密码(用户输入)和盐(来自数据库)。

下面是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;
    }
}

我希望这对你有所帮助,如果没有,或者你有任何问题,尽管问。