无法使用随机生成的盐验证md5哈希密码?

时间:2015-06-08 08:54:28

标签: php hash md5 salt password-hash

我意识到这不是那么安全,但我想这样做。

我有这个代码从用户的条目生成密码( $ password )......

$salt = mcrypt_create_iv(22, MCRYPT_DEV_URANDOM);
$new_password = md5($salt . $password);
$new_password = $salt . $new_password;

这就是我试图检查保存的密码的方法:

$split_salt = substr($saved_password, 0, 22);
$incomplete_password = md5($split_salt . $current_password);
$hashed_password = $split_salt . $incomplete_password;

if ($saved_password != $hashed_password) {

    $error = "error";

} else {

     //Validated

}

据我所知,这应该有效。但是,我收到错误而不是验证。这与MCRYPT没有产生正好22个字符有什么关系吗?

1 个答案:

答案 0 :(得分:2)

我知道这不是你想听到的,但你的方案是如此完全不安全,一个好的解决方案实施起来很简单,你应该重新考虑:

// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);

// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);

你的实际问题是盐,mcrypt_create_iv()将返回二进制字符串,它很可能包含\ 0字符。如果您的方法有效,那么这是纯粹的运气。