10

我知道盐将相同的密码散列到不同的值。但是,盐通常与密码一起存储在数据库中。所以假设我是攻击者,这就是我如何使用字典攻击来攻击盐(注意在这个例子中,为了简洁起见,我没有写出 128 位哈希或盐):

user_pw = 'blowfish'

Given:
email = 'blah@blah.com'
hash = '1234567890'
salt = '0987654321'

function attack(){
  for each(word in dictionary)
    md5( word * salt ) == hash ? cracked_one(email, word)
}

我知道这可以防止黑客使用彩虹表......但似乎并不能防止字典攻击。我想您可以在哈希算法中添加其他内容,但出于安全考虑,我们必须假设攻击方法是已知的。

因此,加盐似乎可以防止黑客找出哪些密码可能是字典密码(多个用户拥有的密码)并防止彩虹攻击......但不能防止字典攻击。

这是正确的分析吗?有什么更好的安全建议吗?

谢谢!

4

5 回答 5

11

Salt 不能防止字典攻击,只是预先计算的字典攻击。特别是,它可以防止彩虹表 ( http://en.wikipedia.org/wiki/Rainbow_table ) 并且还确保破解一个用户的密码不会自动让您破解任何共享该密码的用户。

我链接到的文章提到了一些改进加盐的方法,包括加强键(http://en.wikipedia.org/wiki/Key_strengthening)。

于 2009-07-10T19:28:30.877 回答
4

没有什么可以阻止攻击者仅仅猜测密码。

盐只是通过迫使攻击者在每个用户(实际上是每个盐)基础上对字典进行散列来使其更难。

为了提高安全性,可调整的散列函数是您最好的选择。加快每次散列的时间,使字典攻击在攻击者可能拥有的任何硬件上都不切实际。

基本上,读这个

于 2009-07-10T19:33:12.350 回答
1

这是正确的。如果有人得到了密码材料,字典攻击将是有效的。

为了防止这种情况:

  • 确保您的密码不受字典攻击。
  • 确保您的密码文件 ( /etc/shadow) 只有 root 才能读取。
于 2009-07-10T19:27:22.250 回答
1

没有盐,攻击者可以为他的字典中的每个单词生成哈希,然后针对你的密码列表运行新字典

使用 salt,每个密码都使用随机字符串进行哈希处理,因此即使使用先前的哈希字典知识,他仍然必须重新创建一个新的哈希字典,其中包含数据库中每个不同 salt 的 salt。

只需将字典表视为彩虹表的子集(一小部分)。虽然彩虹表可以包含数十亿个条目,但字典包含“已知单词”,因此最多可能有几百万个条目。

彩虹表对盐失败的原因是因为重新创建过程将是“数十亿个条目”的重新计算,而字典攻击仍然是“几百万个条目”。盐只是阻止预先计算的值

于 2009-07-10T19:28:52.280 回答
0

您的逻辑是合理的,但实际上,只要有足够的计算能力和时间,就无法抵御字典/蛮力攻击。

于 2009-07-10T19:27:44.433 回答