【问题标题】:Does user input need to be hashed before being used in password_verify?在password_verify中使用用户输入之前是否需要进行哈希处理?
【发布时间】:2018-03-12 14:35:31
【问题描述】:

我有一个输入字段,用户可以在其中输入用户名和密码。我是否需要对他们输入的密码进行哈希处理,或者是否可以保留它并仅在 password_verify 中针对哈希数据库密码使用它。我正在使用 password_hash 用 PASSWORD_BCRYPT 对它们进行哈希处理,如果我必须对输入和存储的密码进行哈希处理,我不知道如何比较它们。

【问题讨论】:

标签: php sql security hash passwords


【解决方案1】:

这不是必需的,但you can do that 如果您希望用户提供超过 71 个字符的密码。

如果您决定预散列,不要只将原始二进制字符串传递给password_hash()/password_verify()。你最终会制造另一个弱点。

随附文章的示例代码演示了这种精确设置中的Bcrypt-SHA384

【讨论】:

    【解决方案2】:

    没有。当您使用password_hash 或类似函数对您的密码进行哈希处理时,您不应在使用password_verify 对其进行测试之前对密码进行哈希处理。至少只要你不“双重哈希它”,这是非常没用的。

    password_hash 方法将返回一个值,其中包含它使用的哈希值、盐和成本。因此,当它被传递给verify_password 方法时,该方法将知道如何处理作为第一个参数传递的明文密码。

    您可以在 PHP 文档中阅读所有这些内容:

    http://php.net/manual/en/function.password-verify.php
    http://php.net/manual/en/function.password-hash.php

    【讨论】:

    • 我有点担心这是一个安全问题。感谢您的澄清
    • 密码总是必须以明文形式传递给服务器(为什么你希望使用 TLS 进行传输),你从不以明文形式存储密码,你存储来自@的哈希987654327@ 并且仅使用password_verify 进行验证,只要您不以哈希值以外的其他形式存储密码,它应该足够安全。 :)
    • 好的,感谢您的帮助
    • if (isset($_POST["submit"])) { $query = mysqli_prepare($conn, "SELECT * FROM user_logons WHERE Username = ? AND Password = ?"); $result = mysqli_query($conn, "SELECT Password FROM user_logons"); $result_data = mysqli_fetch_row($result); $hash = strval($result_data[0]); $username = mysqli_real_escape_string($conn, $_POST["username"]); mysqli_stmt_bind_param ($query , 'ss' , $username , $_POST["password"]); mysqli_stmt_execute($query); if (password_verify($_POST["password"], $hash)) { echo "Correct Password"; } else { echo "Incorrect Password"; } }
    • 可以吗(因为我没有存储明文密码)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-23
    • 2016-08-16
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 2014-07-11
    相关资源
    最近更新 更多