我有这样的代码:
$password = vancab123;
password_hash(base64_encode( hash('sha512',$password, true) ), PASSWORD_DEFAULT );
数据库存储值:
$password = $2y$10$jUa8ZEFBX5lfsBmySUnJFeSSyKwQ1v/emazJZPh8MwJ0g0lLbmjYC;
我的问题:
我在"记住我"功能上使用了这个。如果用户使用该功能,他/她的凭据(电子邮件和密码)将被保存7天使用cookie。
我的问题是因为电子邮件和密码会自动填满电子邮件和密码文本框,密码文本框字符太长,因为它是散列的。
如何将散列密码的长度与原始/非散列密码匹配?
您不需要跳过所有这些障碍来使用password_hash
,这就是如何检查输入的密码是否与先前散列的密码匹配
HASH的关键是它不能(在一个合理的时间范围内)被转换回它的原始值。相反,您必须使用password_verify()将其与用户返回并尝试使用相同密码登录时输入的未散列值进行比较。
$password = 'vancab123';
$hashed_pwd = password_hash($password);
// test the hashed password
if ( password_verify($password, $hashed_pwd) ) {
//password entered is OK
} else {
//password entered is WRONG
}
在你澄清你的问题之后的补充:
阅读这篇文章了解Remember me功能实现"记住我"的最佳方式是什么?为了一个网站?
哈希是任意值的单向转换。它们本质上是不可逆的。在您的示例中,您必须对用户提供的密码进行散列,从数据库中检索值,并对两个散列值进行比较。
唯一的替代方案是彩虹攻击背后的范式,其中您将所有可能的可能性散列并将它们存储为键值对,但这是大量的数据。