【问题标题】:The point with the salt in bcryptbcrypt 中加盐的要点
【发布时间】:2012-10-13 18:54:50
【问题描述】:

对不起,如果这是一个愚蠢的问题,我只想知道:bcrypt 中的盐有什么意义?我的意思是,如果您有以下代码用于从密码创建哈希:

function generateSalt() {
$salt = '$2a$13$';
$salt = $salt . '1111111111111111111111';
return $salt;
}

function generateHash($salt, $password) {
$hash = crypt($password, $salt);

return $hash;
}

$salt = generateSalt();

$providedPassword = generateHash($salt, rand(3,29));

echo $providedPassword;

上面的输出例如:

$2a$13$111111111111111111111uDdpsIcwCVOwEyNueskXkniY5206fW

$2a$13$111111111111111111111udcvrNt9quPukFRl8./jXRzDGfE9lw0W

因此您可以清楚地看到盐的结束位置,如果有人获得了数据库,盐就没有意义,因为他们可以删除盐部分并仅搜索散列密码。那么,我使用 bcrypt 错了吗? (静态盐只是为了显示它在我的哈希中出现的位置),或者这有什么原因?

【问题讨论】:

    标签: php bcrypt


    【解决方案1】:

    salt 背后的想法是,即使两个输入相同,只要每次使用不同的盐,哈希值也不会相同。

    例如,许多用户选择相同的密码。如果您只存储密码的哈希值,数据库将包含许多相同的哈希值 - 因此,如果攻击者只找到一次密码,他就可以轻松地将其用于所有这些用户。但是,如果密码对每个用户使用不同的盐值进行哈希处理,攻击者将不得不破解存储在存储中的每个哈希值。

    我不确定您使用的代码是什么(crypt 函数是什么?),但如果它在实际哈希值前添加盐值 也可以,只要哈希值本身也被计算使用盐。无论如何,您都需要存储原始盐以验证新输入(密码)是否与存储的哈希匹配。但是,只要您在每次哈希使用之间更改盐值,就没有简单的方法来收集有关原始输入的信息。

    【讨论】:

    • 我在我的问题中显示了代码,我从这个站点得到了代码nathandavison.com/posts/view/13/… 也许我实现错了,因为盐在“$ 2a”之前的哈希开始处结束$13$"
    • 必须为每个密码随机生成盐。为所有密码设置一个固定的盐是没有意义的。您使用的代码会生成一个固定的盐。
    • 我知道,但我想表明的是,盐最终没有与被散列的值混合在一起,只是在它被创建的开始。我说得有道理吗?哈哈
    • crypt($password, $salt) 部分表示生成的哈希包含盐。当您将盐 + 哈希存储在数据库中时,只需将它们连接起来就可以了。盐不是秘密(哈希也不是秘密)。
    • 你的意思是哈希在我展示的开头包含盐,在“$2a$13$”之后的实际哈希中包含盐吗?
    【解决方案2】:

    对散列进行加盐是一种加强散列以抵御可能允许散列反转为其原始值的攻击的方法,同时散列在主机之间在线发送。在这种情况下,窃听者可以捕获哈希,但在不知道盐值的情况下,无论采用何种技术,都永远无法反转哈希。

    【讨论】:

    • 但是正如我展示的那样,盐只是与一开始的实际散列分开包含,还是密码与盐一起散列?
    • @FrankThomas:这并不完全正确。盐并不是真的用来加强哈希,而是使预计算攻击变得不可行。基本上,它可以防止“彩虹表”攻击,并保护碰巧使用相同密码的用户。它保护存储的密码。 SSL 通常用于保护线路上的信息。
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 2020-12-13
    • 2010-09-21
    • 1970-01-01
    • 2014-01-31
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    相关资源
    最近更新 更多