为什么盐在使用字典攻击时没有帮助

时间:2012-02-09 23:21:26

标签: security hash saltedhash

从此网站http://codahale.com/how-to-safely-store-a-password/

  

重要的是要注意盐对于防止字典攻击或暴力攻击是无用的。

如果盐无法阻止字典攻击,为什么要使用盐?

9 个答案:

答案 0 :(得分:6)

对于单个密码,它没有那么大的差别。强制使用未加密码的密码与强制使用加密密码一样困难。你只需要尝试按键,直到受到重击。

不同之处在于存在大量密码,例如在泄漏的数据库中。基本思想是在破解许多密码时可以重复使用部分必要的计算。这是通过构建彩虹表来完成的。这样做计算成本很高,但一旦完成,攻击者就可以相对快速地破解大量密码。使用彩虹表破解N密码要快于强制执行这些N密码。

如果每个密码都使用单个盐进行哈希处理,则无法以相同方式重复使用信息。您仍然可以构建彩虹表,但它们只能用于数据库中的一个密码,这使得它们无用。因此,为了破解N密码,您必须单独强制使用所有N密码,这对攻击者来说通常是不切实际的。

对于无密码密码和流行的哈希算法,您只需从Internet下载预先计算的彩虹表,因此攻击者甚至不必自己计算。他只需下载一个表并查找特定哈希的密码即可。盐阻止了这一点。

无保留哈希还有一个缺点,即具有相同密码的两个用户的密码哈希是相同的。因此,如果攻击者发现多个用户使用相同的密码哈希,他只需要破解该密码一次。

答案 1 :(得分:1)

如果'攻击者'拥有您的网站/应用使用的密码哈希(和盐),他们只会强行使用“盐”+“密码”。

但是,使用salt可以提供更多针对彩虹表(预先计算的哈希表)的保护,因此它们仍然值得使用。

答案 2 :(得分:1)

盐可防止通过彩虹表从字典中立即开裂;文章和后续文章指出CPU /存储权衡现在使得彩虹表没有意义,所以盐对你没有帮助。当然,他们从未帮助过暴力攻击。

答案 3 :(得分:1)

为了便于说明,假设您使用2个字符串作为盐,可以是集合中的随机元素 salts = {'00', '01', '02'...... '99'}

您使用的公式是:

salt = salts[rnd(100)]      # gets a random element from the set above, say '87' 
password_hash = MD5(password + salt) # say the hash is 'dai480hgld0'

此后,您将在数据库中保存哈希值和salt,例如

+---------------------------+
| password_hash      |  salt|
+---------------------------+
| dai480hgld0        |  87  |
| sjknigu2948        |  23  |
| .                  |  .   |
| .                  |  .   |
+--------------------+------+

我们假设在受感染的系统中,攻击者可以访问您的代码 - 因此他知道您如何计算哈希值。
攻击者也可以访问您的数据库,因此他拥有所有密码哈希值和盐。

鉴于此信息,为了破解您的密码(具有哈希:'dai480hgld0'),他必须执行以下操作:

for word in dictionary_words #iterate over all the words in dictionary
  for salt in salts          #iterate over all possible salts (100 iterations)
     password_hash = MD5(word + salt)
     if password_hash == 'dai480hgld0'
       print "The password is " + word
       exit()  
     endif
  next
next

请注意,如果您根本没有没有使用任何盐,那么算法就是

for word in dictionary_words #iterate over all the words in dictionary
  password_hash = MD5(word)
  if password_hash == 'dai480hgld0'
    print "The password is " + word
    exit()  
  endif
next

从上面两个代码示例中可以明显看出,在密码中添加一个盐会增加暴力攻击的尝试次数。在我们的案例中,由于有100种可能的盐,你已经让攻击者用100种盐来尝试每个单词。

所以,总结一下:

  • 盐很好。它们使您的密码难以破解。即使您的用户输入弱密码,salt也会确保生成的哈希值不可搜索。例如,它很容易谷歌哈希'3cc31cd246149aec68079241e71e98f6'这实际上是一个相当复杂的密码,几乎可以满足所有密码策略。仍然破解它不需要一行代码!

  • 盐不是灵丹妙药。它们只会增加破解者暴力破解密码所需的时间。但是,如果您的盐地址空间相当大,那么您就相当不错了。例如,如果你有32个字符的字母数字字符串作为盐 - 暴力将真的需要很长时间。

  • 像bcrypt这样的慢速算法在这方面帮助你只是因为它们很好......“慢”。对于蛮力攻击,打破计算速度慢的哈希将花费不切实际的时间。

答案 4 :(得分:0)

Salt使加密更强大。但是,字典攻击不会尝试解密密码哈希,所以盐或没盐,没关系,他们只会尝试许多密码,直到一个工作。

答案 5 :(得分:0)

这属于security.stackexchange.com

问题在于计算容量与散列算法的速度相结合。基本上,他正在投球,这很慢。

如果黑客同时使用了散列和盐,并且知道用于散列密码的算法,那么破解它只是时间问题。

如果使用非常快的算法,则该时间非常短。如果使用极慢的算法,那么显然,找到命中的时间会更长。

这让我们首先了解为什么我们首先哈希/加盐:购买时间。可用于更改列出的所有密码的时间以及联系所有用户的时间,以便在需要更改其他系统上的密码时让他们知道。

我们使用salt的原因是强制黑客按照盐值构建彩虹表。这样,一个表不能用于破解所有密码。这样做的唯一原因是为了节省时间,并希望能够阻止普通黑客投入更多资源来破解所有这些。

无论使用何种机制,散列密码都不安全,因为大多数人都会使用该密码。安全并不意味着“永远不会破解”。相反,它意味着“在破解时间/努力方面,这将是昂贵的”。对于大多数黑客来说,他们想要的是低悬的水果,例如只有明文。对于一些人来说,他们会去任何需要的极端,例如根据盐值建造大量的彩虹表来获得它们。

当然,支持这一点的是,是否可以在用户表中轻松识别任何“超级”用户帐户。对于大多数系统来说,只破解sys admin类型的帐户就足够了,因此每个用户使用不同的salt值这一事实并不重要。聪明的人只会为这一个帐户烦恼。

答案 6 :(得分:0)

这并不完全准确,因为大多数情况都取决于你的假设。

主要假设是:

  1. 攻击者有盐
  2. “动态”计算哈希值非常快(就像盐一样,他需要重新计算所有并且不能使用预定义列表)
  3. 每个用户使用相同的盐。

答案 7 :(得分:0)

现在这似乎不是一个编程问题,所以我只会给你一些有关盐析和加密的信息:

salting的目的是帮助Hashing这样的单向函数,Hashing在密码学中被广泛使用,由于难以猜测而经常使用密码,以及其他攻击如蛮力攻击所需的时间破解它们。

如果您想安全存储密码,最好的办法绝对是加密。在维基百科上查找加密,了解更多信息。

答案 8 :(得分:0)

两条评论:

  1. 可以迭代常规哈希算法。不需要使用非标准算法只是因为你想增加工作因素。

  2. 即使您使用慢哈希方法,也建议使用Salt。它可能不一定会增加最佳攻击的工作量,但如果用户选择的密码与另一个用户,另一个帐户或旧密码的密码相同,它将阻止琐碎的攻击。<​​/ p>