【发布时间】: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 个字符,之后的任何内容都会被截断。希望这是有道理的。