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

如何将散列密码与用户输入进行比较?

章高爽
2023-03-14

我试图匹配和验证用户通过$_POST输入的密码和数据库中的哈希密码。问题是,当我散列输入密码时,BCRYPT每次都会产生一个新的散列,这意味着没有两个散列是相同的,这不会给我匹配。我怎么可能匹配BCRYPT散列密码?感谢您的任何帮助!

登录:

$password = password_hash(htmlentities($_POST['password']), PASSWORD_BCRYPT, array(
'cost'=>14)); 

$stmt = $mcon->prepare("SELECT `password` FROM members WHERE password=:password");
$stmt->bindParam(":password", $password);
$stmt->execute();

//get_result
$data_array = $stmt->fetch(PDO::FETCH_ASSOC);
//echo passwords
echo  'Password from form: ' . $password . '<br />';
echo 'Password from DB: ' . $data_array['password'] . '<br />';
//verify password
if (password_verify($password , $data_array)) {
    echo 'success';
    exit();
}else{
    echo 'Try again m9';
    exit();
}

//if $_POST password and $hashedpassword match then start session

$stmt->close();
$mcon->close();

共有2个答案

通宾白
2023-03-14

代码中的另一个错误:funtcionpassword_verify需要hash字符串作为第二个参数。不要将此与php-hash-data结构混淆。所以你需要这样称呼它:

$password_input = $_POST['password'];
password_verify($password_input , $data_array['password']);

http://php.net/manual/de/function.password-verify.php

公冶和豫
2023-03-14

这不是一个答案,但它仍然对您有用。不要筛选密码(WHERE子句),而是筛选用户名:

$stmt = $mcon->prepare("SELECT password FROM members WHERE username=:username");
$stmt->bindParam(":username", $username);
$stmt->execute();

此外,不要在数据库中存储密码,即使是加密的密码。只是存储了散列值和salt值。通过随机化更改每个密码的salt。

如果你真的需要实施安全您至少应该阅读这样的东西但事实是越多你阅读和研究越好它是有没有限制多少你真的需要知道有一个安全的网站如果这样的事情真的存在。

也许一个框架会更好,比如Laravel或Symfony。他们有处理这些细节的插件,你不可能希望写任何接近这些安全标准的东西。

只是为了向您展示您的代码是如何不安全地阅读关于OWASP上的前10个PHP攻击。

 类似资料:
  • 问题内容: 我有一个脚本化的管道,可以使用该功能请求用户的密码,并将其与用户保存的凭据密码短语进行比较。如果用户输入是一种类型,则可以使用。但是,当我将输入类型更改为(因此用户输入时在屏幕上看不到该输入类型)时,它将失败并显示断言错误。 我确保输入与凭证文件中的密码匹配的密码。 我正在将Jenkins 2.83与最新的Credentials插件和Credentials绑定插件一起使用。 脚本: 我

  • 我的应用程序中有一个用例,它应该防止用户在重置密码时选择最后3个密码中的一个。我使用Angular作为前端,spring boot作为后端。在我的场景中,用户密码存储为bcrypt哈希。 如何将用户输入的密码与最近3个存储的bcrypt密码进行比较? 当我运行下面的代码片段示例时, 它生成以下bcrypt哈希。每个散列都是不同的,这是合理的,因为当我检查时,我可以看到生成的salt是随机值。 sp

  • 你好!我正在用java中的swing包创建一个简单的登录表单,在检查用户名和密码是否正确时遇到了问题。 以下是当前的代码: } 这个想法是在密码和用户名文件中存储多个帐户。例如,文件内容是: Username.txt: 暗语txt: 如果用户名文件的第1行是“sampleUsername1”,那么它的密码也来自密码文件的第1行“samplePassword1”。如果用户和密码不在同一行或不在文件中

  • 问题内容: 我想用散列密码,以后再验证提供的密码是否正确。 散列密码很容易: 如何将纯文本密码与存储的哈希值进行比较? 问题答案: 使用py-bcrypt,您不需要单独存储盐:将盐存储在哈希中。 您可以简单地将哈希用作盐,盐将存储在哈希的开头。

  • 如果用户创建了一个新密码,并通过哈希算法存储在数据库中,则在用户登录时可以将其与用户输入的密码进行匹配。输入到登录屏幕的密码将被哈希化,然后检查它是否与存储的哈希匹配。如果是,则允许用户访问。 然而,如今,密码是经过哈希和盐处理的。因此,当用户第一次注册密码时,它会经过一个散列,然后会被加密10000次以上。这个salt与后端代码生成的关键字相同,还是每次salt都随机生成? 当用户输入密码登录时

  • 我试图修改代码以包含HASH_PASSWORD,但我不相信我做得对。

  • 我正在研究一个已经用MD5(没有salt)散列用户密码的系统。我想使用SHA-512和SALT更安全地存储密码。 虽然这对于将来的密码来说很容易实现,但我也想修改现有的MD5散列密码,最好不强迫所有用户更改他们的密码。我的想法是只使用SHA-512和一个适当的salt来散列现有的MD5散列。然后,我可以在数据库中设置一些标志,指示哪些密码是从纯文本散列出来的,哪些密码是从MD5散列出来的。或者我可

  • 我已经使用带有JPA的安全性实现了。我的所有RESTendpoint现在都可以验证客户端请求的头。密码的验证由框架完成。现在我需要能够验证一个密码与存储的密码哈希。 在默认配置下,用户密码以散列形式存储,并使用函数。如何检查给定的密码字符串是否与存储的bcrypt哈希值匹配? 来源:https://quarkus.io/guides/security-jpa