【问题标题】:Bcrypt, how do you verify with the random salt?Bcrypt,您如何使用随机盐进行验证?
【发布时间】:2016-03-27 00:27:40
【问题描述】:

我从 PHP 网站上得到了这段代码。我可以在没有盐的情况下完成这项工作。但是你如何用盐验证 - 或者它是否必须存储到一个变量中然后你以后使用它?不确定如何进行下一步验证。很多关于如何制作哈希的教程,但验证是另一回事。谢谢。

$options = [
'cost' => 11,
'salt' => mcrypt_create_iv(22, MCRYPT_DEV_URANDOM),
];
echo password_hash("rasmuslerdorf", PASSWORD_BCRYPT, $options)."\n";


// See the password_hash() example to see where this came from.
$hash = '$2y$11$nJp/w0OC41I0m44T9OQKBuWUrQi63PrJuvDc68KI6oDBdnZK01kiW ';

if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}

【问题讨论】:

    标签: php hash salt bcrypt


    【解决方案1】:

    请注意,password_hash() 将算法、成本和盐作为返回哈希的一部分返回。因此,验证哈希所需的所有信息都包含在其中。这允许验证函数验证哈希,而无需单独存储盐或算法信息。

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

    只需像上面一样使用该功能,它会自动检测盐。

    如果省略,password_hash() 将为每个散列的密码生成一个随机盐。这是预期的操作模式。

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

    即使您不添加盐,password_hash 也会自动添加一个随机生成的,因此您在验证已添加盐的密码时应该不会有任何问题。

    还要注意:

    从 PHP 7.0.0 开始不推荐使用 salt 选项。现在更倾向于简单地使用默认生成的盐。

    【讨论】:

    • 我想让我感到困惑的是:是否添加了盐以帮助使其更难加密,现在如果它被随机包含,PHP 将如何知道如何解密它,除非它在一个单独的变量或数据库?
    • 例如,假设 password_hash() 函数生成了这个哈希值:$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa2a 标识加密算法(在本例中为 BCRYPT),10 是成本(在您的情况下为 11),vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa 是盐和密文,在修改后的 Base-64 中连接和编码。前 22 个字符解码为 salt 的 16 字节值。检查此answer 以获得更好的解释:)
    猜你喜欢
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-04
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    相关资源
    最近更新 更多