当前位置: 首页 > 知识库问答 >
问题:

为什么php密码验证和密码散列使用不同的加密标识符?

万俟玉书
2023-03-14

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

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

下面是我遇到麻烦的代码示例($2y$标识符不会返回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.';
}
?>

下面是一个正在工作的代码示例($2a$加密不是由密码\u散列函数生成的)。

<?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.';
}
?>

共有1个答案

淳于鹏
2023-03-14

我怀疑原始散列和/或

我以前经常看到这种情况。

如果是这种情况,trim()it。

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

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

然后将其粘贴到当前哈希的位置。

 类似资料:
  • 我正在使用以下代码创建哈希密码和salt: 我正在数据库中存储HashedPassword和Salt。 现在我要验证用户登录时的密码: 这不起作用,我得到了一个完全不同的哈希密码,而不是存储在数据库中的密码。据我所知,您应该在用户登录时输入的密码之前预置salt,然后运行相同的哈希密码函数。上面不是等价于那个吗?

  • 在我的登录PHP文件中,我有这些 在我的注册PHP文件中,我有这个。 现在,基本上我使它哈希密码,并插入自己的数据库注册。确实如此。 然而,它无法核实。这两个结果给出了两个不同的哈希,我不知道我可能做错了什么。我也试着让它再次散列输入并检查数据库中的password_hash,但那不起作用... 正确的使用方法是什么? (另外,$passSign和$userInput是输入字段,它确实获取用户名/

  • 我模拟存储密码散列,并在登录过程中验证它。 我有一个名为的方法来获取字符串密码,并通过添加盐返回它的哈希值。 我选择一个静态值,在本例中,我选择一个相同的密码值() 但结果是: 为什么这两个值不相同? 我的代码有什么问题?

  • 我一直在阅读OWASP10,我遇到了存储信息的最佳实践。咸杂碎。在这里,您为每个密码生成一个随机的salt,并对其进行梳理、散列和存储。我的疑问是,如果salt是随机生成的,当用户键入密码时,如何对密码进行身份验证?salt是否与用户名一起保存?如果是这样,这种做法仍然是脆弱的。或者他们是怎么做到的?

  • 我正在处理一个pet项目,现在我想添加用户注册支持。经过一些研究,我决定在数据库中保存哈希密码和salt,而不是原始密码。然而,我不知道这些步骤是什么,顺序是什么。以下是我的假设: 注册 客户端向服务器发送用户名和密码(https) 服务器获取密码,生成随机salt Base64对盐进行编码 用stringify salt散列密码 Base64对密码进行编码 将密码和salt保存到数据库中 登录

  • 我用哈希法通过了一个密码 这将密码作为哈希值存储到数据库中。但是当我试图通过 无论密码是否正确,它都会告诉我密码是正确的。有没有办法解决这个问题,所以我可以散列密码,但登录时输入(非散列)密码。