2

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

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

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

4

9 回答 9

6

对于单个密码,它并没有太大的区别。暴力破解未加盐的密码与暴力破解加盐密码一样困难。您只需尝试按键,直到成功。

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

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

对于无盐密码和流行的哈希算法,您可以简单地从互联网上下载预先计算好的彩虹表,这样攻击者甚至不必自己计算它们。他可以下载一个表格并查找特定哈希的密码。盐可以防止这种情况。

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

于 2012-02-10T01:12:44.317 回答
1

如果“攻击者”拥有您的网站/应用程序使用的密码哈希(和盐),他们将简单地暴力破解“盐”+“密码”。

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

于 2012-02-09T23:26:41.117 回答
1

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

于 2012-02-09T23:32:32.907 回答
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'

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

+---------------+
| 密码哈希 | 盐|
+---------------+
| 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 这样的慢速算法可以在这方面为您提供帮助,因为它们很好......“慢”。对于蛮力攻击,破坏计算缓慢的哈希将花费不切实际的时间。
于 2012-02-10T16:47:45.617 回答
0

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

于 2012-02-09T23:25:48.390 回答
0

这属于 security.stackexchange.com

问题在于计算能力与散列算法的速度相结合。基本上,他在推销 bcrypt,这很慢。

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

如果使用非常快的算法,那么这个时间就很短了。如果使用非常慢的算法,那么显然要花更长的时间来找到命中。

这让我们首先想到了我们首先对事物进行哈希/加盐的主要原因:购买时间。可以用来更改所有列出的密码的时间,以及联系所有用户让他们知道的时间,以防他们需要在其他系统上更改密码。

我们使用盐的原因是迫使黑客为每个盐值建立一个彩虹表。这样,一张表就不能用来破解你所有的密码。这样做的唯一原因是为了争取时间,并希望阻止普通黑客投入更多资源来破解所有黑客。

散列密码,无论使用何种机制,在大多数人接受这个词的意义上都是不安全的。安全并不意味着“永远不会被破解”。相反,它的意思是“就破解的时间/精力而言,这将是昂贵的”。对于大多数黑客来说,他们只想要明文等容易实现的目标。对一些人来说,他们会走到任何需要的极端,例如为每个盐值构建巨大的彩虹表来获取它们。

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

于 2012-02-09T23:27:36.747 回答
0

它并不完全准确,因为大多数事情都取决于您的假设。

主要假设是:

  1. 攻击者有盐
  2. “即时”计算哈希值非常快(与盐一样,他需要重新计算所有内容并且无法使用预定义的列表)
  3. 每个用户使用相同的盐。
于 2012-02-09T23:31:38.010 回答
0

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

加盐的目的是帮助像散列这样的单向函数,它在密码学中被广泛使用,由于密码难以猜测而经常使用密码,以及其他攻击(如暴力攻击)破解密码所需的时间。

如果您想安全地存储密码,最好的方法肯定是加密。在 Wikipedia 上查找加密以获取更多信息。

于 2012-02-09T23:36:56.387 回答
0

两条评论:

  1. 可以迭代常规哈希算法。没有必要仅仅因为你想增加工作因子就使用非标准算法。

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

于 2012-02-10T00:36:18.463 回答