【问题标题】:How to store php password_hash in mysql DB如何在 mysql DB 中存储 php password_hash
【发布时间】:2015-07-20 20:02:32
【问题描述】:

我正在尝试通过关注this website 来实现安全的用户身份验证。但我无法存储 php password_hash 函数的字符串结果。我的意思是,这非常有效:

$pass = "anypassyouwant";
$stored = password_hash(
    base64_encode(
        hash('sha256', $pass, true)
    ),
    PASSWORD_DEFAULT
);
// ...
if (password_verify(
    base64_encode(
        hash('sha256', $pass, true)
    ),
    $stored
)) {
    echo "TRUE";
} else {
    echo "FALSE";
}

在真正的应用程序中,我将“$stored”存储在我的数据库中并将其用于密码验证,但我得到的只是一个错误。由于上述代码完美运行,唯一合理的解释是数据库中的存储。 Varchar 和二进制文件不起作用。

有人知道我应该如何存储它吗?

提前致谢。

我的插入指令:

$sql = sprintf("
    INSERT INTO tbl_usuarios (nombre, apellidos, password, email, fechanac, url_in, sexo)
    VALUES ('%s', '%s', '%s', '%s', '%s', '%s', %u)",
    $nombre,
    $apellidos,
    $pass,
    $bd->escape($_POST['email']),
    $fechanac,
    $url_in,
    $sexo
);

其中 pass 是 password_hash 的结果。我尝试了 %s 和 %b(数据库中的 varchar 和二进制)。

【问题讨论】:

  • 插入代码在哪里?另外,请确保列的长度足以容纳散列。投票为不清楚。
  • 查看@look 的答案以解决您的问题:stackoverflow.com/questions/29959689/…
  • 使用 PHP 的 built-in functions 散列和存储密码。
  • 在这种情况下执行base64_encode() 不会向您的应用程序添加任何内容,它实际上会缩短传递给password_hash() 的哈希长度。 sha256 散列长度是 64 个字符,如果你对它进行 base64 编码,它会增加到 88 个字符,但是 bcrypt(在 password_hash 中使用)限制为 55 个字符,之后的任何内容都会被截断。希望这是有道理的。

标签: php mysql hash passwords


【解决方案1】:

在您发布的插入代码中,您引用了变量$pass,而不是存储密码的哈希和base64 编码版本。您可能需要更新 SQL 查询以使用 $stored 变量而不是 $pass

此外,在调试时,将您从数据库中检索到的内容与经过哈希处理的输入内容进行比较会很有帮助。这可能表明您不小心存储了明文密码而不是散列版本。

【讨论】:

  • 我从我使用的原始php文件中复制了插入代码,上面的代码只是我写的一个测试,看看发生了什么,抱歉不清楚。我已经做了一些测试,存储在数据库中的不是 password_hash 返回的内容,无论我选择 varchar、二进制还是其他任何东西,它都不会存储 password_hash 返回的内容
  • @DandyCC 注意password_hash() 使用随机盐,因此每次的哈希值都会不同。如果您要比较数据库包含的内容和 password_hash 返回的内容,您需要确保它使用相同的盐,否则结果将始终不同。尝试设置特定的盐(仅用于测试)并将从数据库返回的内容与 password_hash() 的输出进行比较。如果被截断,则需要增加数据库中列的长度。
猜你喜欢
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2012-04-24
相关资源
最近更新 更多