如何比较用户输入的散列密码?

时间:2015-02-08 23:45:32

标签: php hash cryptography

我希望我的登录密码是安全的。所以我开始使用PHP的crypt()函数在将密码插入数据库之前对其进行哈希处理。但是在比较转换后的哈希密码的用户输入密码时遇到了麻烦。这是我的代码:

<?php
$password = 'hello_password';

# A higher "cost" is more secure
$cost = 10;

# Create a random salt
$salt = strtr(base64_encode(mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)), '+', '.');

# Blowfish algorithm. 
$salt = sprintf("$2a$%02d$", $cost) . $salt;
$salted_password = $password . $salt;  // apply salt to password

# hash the password
$hash_password = hash('sha256', $salted_password);

$userInput = 'hello_password';  // suppose this is the user input password 

if (hash('sha256',$userInput) == $password) {
    echo "Password Verified.";
}
else {
    echo "Incorrect Password";
}

&GT;

但它始终显示密码不正确,尽管我的密码是正确的。我不想使用“hash_equals”函数,因为我目前的PHP版本不支持它。有人可以帮我弄这个吗 ?谢谢

1 个答案:

答案 0 :(得分:1)

您正在将散列用户输入与实际用户密码进行比较。所以当然这永远不会起作用。

你基本上问的是hash =='hello_password'。哈希将永远不会匹配,这是哈希的整个点。您也没有在用户输入中使用salt。

你用一个很好的盐哈希实际密码:

$salted_password = $password . $salt;  // apply salt to password

# hash the password
$hash_password = hash('sha256', $salted_password);

所以你需要用盐来哈希用户输入,方法如下:

$salted_input = $userInput . $salt;  // apply salt to user input

# hash the input
$hash_input = hash('sha256', $salted_input);

然后,您可以将$hash_input$hash_password进行比较。

您也没有正确使用盐。盐应该用于存储密码以防止彩虹表攻击。在比较时随机生成盐以应用于输入和密码是没有意义的。