随机盐如何工作?

信息安全 加密 密码
2021-08-22 11:23:40

我不明白如何使用随机盐来散列密码。也许随机盐指的是散列密码以外的东西?这是我的思考过程:

  1. 盐用于在散列密码之前在密码末尾添加额外的垃圾,以防止被彩虹表破解的可能性

  2. 但是,为了确保您仍然可以验证密码是否正确,您必须在加密之前对每个密码使用相同的盐,以查看它是否与为某个用户保存的哈希值匹配

  3. 如果使用随机盐,如何再次验证该密码?随机盐是否保存在某个地方以用于每次加密?如果盐与散列密码一起保存,对我来说似乎不太安全,而不是使用某种计算的盐,攻击者本质上不会知道他们是否掌握了您的数据。

我不确定我是否在这里遗漏了一些东西,或者随机加盐是否与加密中的不同场景有关,并且在这种特殊情况下没有意义。在上述加密之前散列密码的情况下,随机盐如何工作?

2个回答

随机盐是否保存在某个地方以用于每次加密?

是的

如果盐与散列密码一起保存,对我来说似乎不太安全,而不是使用某种计算的盐,攻击者本质上不会知道他们是否掌握了您的数据。

不是,因为盐的唯一作用和发明是,正如你所说:

与被彩虹桌破解的可能性作斗争

仅此而已。它增加了单个密码的复杂性 - 对于数据库中的每个密码,它都是唯一的。要验证密码,您需要将其存储在旁边。这丝毫不会损害单个密码的安全性——哈希算法仍然像没有盐一样安全。

但是,从整个数据库来看,每个密码都可以更好地抵御彩虹攻击,因为攻击者必须分别使用各自的盐计算非常单一的哈希,并且不能对它们进行批量操作。

要验证没有加盐的散列密码,您需要计算MD5(privided_password)并与存储在数据库中的数据进行比较。它对哈希表进行简单的搜索以解码您的大量密码。(我知道 MD5 对于密码存储很弱,我使用它只是因为哈希值比 SHA-512 短,例如。)

如果使用 salt,则必须计算MD5(provided_password + salt)并与数据库进行比较。由于盐是散列的一部分,因此您将盐存储在数据库中,并将密码存储在用户中。

如果您的 3 个用户有passw0rd密码,并且您使用不加盐的 MD5 对您的密码进行哈希处理,并且有人窃取了您的数据库,它会看到如下内容:

|username    | password                         |
|user1       | 71d00b760d017b2999eb54e32f41f592 |
|user7       | 71d00b760d017b2999eb54e32f41f592 |
|user13      | 71d00b760d017b2999eb54e32f41f592 |

因此,一旦黑客在哈希表中找到一个密码(网上有很多密码),他就知道所有其他密码。

第一步是使用盐。每个密码在散列之前都会有额外的数据,但使用相同的盐:

|username    | salt | password                         |
|user1       | SALT | a66a96b36d78e452202c12d36b6d198c |
|user7       | SALT | a66a96b36d78e452202c12d36b6d198c |
|user13      | SALT | a66a96b36d78e452202c12d36b6d198c |

使用此方案,黑客将不得不暴力破解哈希以获取密码。这需要一些时间,但是一旦破解了一个密码,其他所有密码也会被泄露。

下一步是随机盐每个密码都有不同的随机盐:

|username    | salt | password                         |
|user1       | SALT | a66a96b36d78e452202c12d36b6d198c |
|user7       | ASDF | 8062279f0ba04fa6ee41d0a9e04f4c93 |
|user13      | ABCD | 5743092bfb79214247c50c4102af0b99 |

在这种情况下,即使您的所有用户都拥有相同的密码,黑客也无法通过暴力破解每个密码。在这个例子中,salt 非常短,只有 4 个字节,但是您可以使用更大的 salts(128 个字节或更多)并增加暴力破解密码的难度。