4

抱歉,如果这是一个愚蠢的问题,我只想知道: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$111111111111111111111uDdpsIcwCVOwEyNueskskXkniY5206fW

$2a$13$111111111111111111111udcvrNt9quPukFRl8./jXRzDGfE9lw0W

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

4

2 回答 2

4

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

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

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

于 2012-10-23T19:11:21.990 回答
0

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

于 2012-10-23T19:02:56.530 回答