2016-11-13 50 views
5

经过一些故障排除后,我确定当我使用PHP的password_hash函数对密码进行哈希处理时,加密标识符是$ 2y $。但是,当我使用password_verify函数将存储的散列密码与用户输入密码进行比较时,password_verify将不会返回true。如果我使用https://www.bcrypt-generator.com/上的$ 2a $标识符生成一个新密码,并用它替换存储的散列密码,它将返回true。为什么php password_verify和password_hash使用不同的加密标识符?

我希望有人能解释为什么password_hash($ password,PASSWORD_DEFAULT)使用$ 2y $和为什么password_verify()使用$ 2a $。或者我可能在这里做错了任何事情。我在运行PHP Version 7.0.10的WAMP服务器上本地执行此操作。

以下是我遇到问题的代码示例($ 2y $ identifier不会返回true)。

<?php 
// $hashNotWorking came from password_hash("testing", PASSWORD_DEFAULT)."\n"; 
$hashNotWorking = '$2y$10$DNPos6f7Vo4Z2IrYU./eCObD7BMkwlkK9yiYjb0hvnI14B1dbFHbC'; 

if (password_verify('testing', $hashNotWorking)) { 
echo 'Password is valid!'; 
} else { 
echo 'Invalid password.'; 
} 
?> 

这里是使用的代码(由password_hash功能不产生$ 2A $加密)的一个例子。

<?php 
// $hashWorking came from https://www.bcrypt-generator.com/ 
$hashWorking = '$2a$08$uP75n/pDhUZo6qOOM3DuPug5U2fcSXW4f3MUz8p3SlO5yPZ4fLf9O'; 

if (password_verify('testing', $hashWorking)) { 
echo 'Password is valid!'; 
} else { 
echo 'Invalid password.'; 
} 
?> 

在此先感谢您的帮助。

+0

http://stackoverflow.com/questions/4795385/how-do-you-use-bcrypt-for-hashing-passwords-in-php#comment8558243_6337021看到该评论和该页面上的其他内容。 –

+1

我怀疑你发布了第一个被正确散列的东西。确保散列期间没有引入换行符或
;我以前见过这种情况。 –

+0

谢谢弗雷德。我使用的是“\ n”,因为这就是php.net的例子。我也试过没有,仍然不能得到真实的。我正在阅读你现在发布的链接。试图做更多的研究。 –

回答

4

我怀疑可能在原始散列和/或<br>中引入了空白,或者某些可能已经由用户引入。

我以前经常见过这种情况。

如果是这样的话,trim()吧。

根据我在评论中提到的内容创建一个新的散列,它将起作用。

echo $var = password_hash("testing", PASSWORD_DEFAULT)."\n"; 

然后粘贴它代替你目前的散列。

相关问题