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

I want my login password to be secured. So I came up to use the PHP's crypt() function to hash the password before inserting it to database. But Im having trouble when comparing the user input password from the converted hash password. Here's my code:

<?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";
}

?>

But it always displays Incorrect Password although my password is correct. I don't want to use "hash_equals" function as it is not supported with my current PHP version. Can someone help me with this ? Thanks

dongqianwei6664
dongqianwei6664 我试图将salt存储在数据库中,但是当我比较用户输入和存储的密码时,它不匹配。为什么?
5 年多之前 回复
dongyi5817
dongyi5817 不要忘记将salt存储在数据库中。
5 年多之前 回复
dongyou6795
dongyou6795 你比较原始密码($password),而不是哈希值($hash_password)
5 年多之前 回复
dongyi5070
dongyi5070 你能告诉我怎么样吗?谢谢
5 年多之前 回复
duannaiying9662
duannaiying9662 我的意思是你需要对用户输入进行完全相同的加密,以及对数据库中存储的内容做了什么。
5 年多之前 回复
duanchuopi2298
duanchuopi2298 你的意思是在比较之前使用mcrypt函数?
5 年多之前 回复
douxi3432
douxi3432 您需要以与存储密码时相同的方式加密用户输入的密码。否则哈希怎么样(mcrypt(PASSWORD));去匹配哈希(PASSWORD);?
5 年多之前 回复

1个回答



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

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

你用一个很好的盐哈希实际密码:</ p>

   $ salted_pa​​ssword = $密码。  $盐;  //将salt应用于密码

#hash密码
$ hash_password = hash('sha256',$ salted_pa​​ssword);
</ code> </ pre>

所以你需要 使用salt对用户输入进行哈希处理,方法如下:</ p>

  $ salted_input = $ userInput。  $盐;  //将salt应用于用户输入

#hash输入
$ hash_input = hash('sha256',$ salted_input);
</ code> </ pre>

然后你可以 将 $ hash_input </ code>与 $ hash_password </ code>进行比较。</ p>

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

展开原文

原文

You're comparing a hashed user input to the actual user password. So of course this is never going to work.

You're basically asking if hash == 'hello_password'. A hash will never match that, that is the whole point of a hash. You also aren't using the salt with the user input.

You hash the actual password with a salt which is fine:

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

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

So you need to hash the user input with the salt, the same way:

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

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

Then you can compare $hash_input with $hash_password.

You also aren't using a salt properly. The salt is supposed to be used in the storage of the password to prevent rainbow table attacks. Randomly generating a salt to apply to both the input and the password at the time of comparison is pointless.

douzheng0702
douzheng0702 这就是为什么我说你永远不会存储明文密码...
5 年多之前 回复
dqk42179
dqk42179 当我将纯文本密码存储在数据库中时,它是否容易受到黑客攻击? 正如我所读到的,密码必须转换为哈希,然后将其存储在数据库中。
5 年多之前 回复
dongpao1926
dongpao1926 你是如何存储密码的? 阅读彩虹表攻击,找出盐的原因。 盐和哈希通常用在数据库中,您将哈希和盐存储在每个用户的两个单独的列中。 因此,您永远不会存储纯文本密码。
5 年多之前 回复
doupu2722
doupu2722 你能告诉我使用盐的最佳做法吗? 我真的不知道我刚刚发现了一些代码并自行测试。 请更正我上面的代码。 谢谢
5 年多之前 回复
duanfa2014
duanfa2014 Touche @Devon,现在为时尚早,哈哈! 我想你应该向他展示一些做这种事情的最佳实践片段;)
5 年多之前 回复
duanrang3357
duanrang3357 是的,虽然用于生成盐,但它与哈希无关。 虽然,我不确定他为什么要使用盐,因为它似乎没有用,因为它不用于存储密码。
5 年多之前 回复
dp6319
dp6319 你错过了他实际上是对用户输入进行散列()的事实,但是他没有做整个strtr(base64_encode(mcrypt_create_iv(16,MCRYPT_DEV_URANDOM)),'+','。'); 给用户输入的东西......
5 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐