md5不适用于某些字符

时间:2014-07-31 22:21:51

标签: php login web md5 change-password

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

1 个答案:

答案 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;
    }
}

我希望这有点帮助,如果没有,或者你有任何问题,请问。