哈希和加盐的密码能否防止字典攻击?

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)
}

我了解这可以防止黑客使用彩虹表... 但似乎不能防止字典攻击。 我想你可以向哈希算法添加其他内容,但在安全方面,我们必须假设攻击方法已知。

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

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

谢谢!

5个回答

11

似乎最大的区别在于使用盐,攻击者基本上必须为每个盐或用户计算新的字典或彩虹表。你知道计算一个包含100万个单词的彩虹表需要多长时间吗?(这里不需要精确答案) - Tony
2
不是我个人认为,但http://project-rainbowcrack.com/table.htm说你不需要制作自己的彩虹表:你可以下载他们的。更糟糕的是,黑客正在利用NVidia Cuda GPU加速他们的破解过程。这些彩虹表即使按现代标准也非常庞大,因此将它们乘以至少4G(32位)就足以使存储每个可能的彩虹表变得完全不可行,更不用说生成的成本了。 - Steven Sudit
对于一些人来说可能很明显,但需要注意的是,盐值保护的是哈希值而不是密码本身(即攻击者已经可以访问数据库,哈希值以明文传输等)。 - Dave Satch
@dsatch 盐值保护了密码的哈希值,使得黑客无法从中推导出密码并在其他网站上使用。或者说,这样做会变得更加困难和昂贵。 - Steven Sudit
可以。我的观点有些不同 - OP提到它“似乎不能防止字典攻击”。我想让大家明确,任何人都可以对您的前端进行字典攻击,而不必担心盐的问题。盐的作用是保护您存储此类密码的方式。 - Dave Satch
@dsatch 你说得对。盐值并不是关于前端的,而是关于保护认证数据库的。 - Steven Sudit

4

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

盐可以通过强制攻击者基于每个用户(实际上是每个盐)进行哈希字典来增加难度。

为了提高安全性,可调的哈希函数是最好的选择。增加每个哈希的时间,使字典攻击在攻击者可能拥有的任何硬件上都变得不切实际。

基本上,请阅读此文


可调哈希方法听起来就像密钥强化。任何哈希函数都可以通过反复运行它来进行这种调整。 - Steven Sudit
是的,这是密钥加强和相关技术。不过,好文章,尤其是关于SRP部分。谢谢。 - Steven Sudit

1

没错。如果有人得到了密码材料,字典攻击将会很有效。

为了防范这种情况:

  • 确保您的密码不容易受到字典攻击。
  • 确保您的密码文件(/etc/shadow)只能被 root 用户读取。

这可能是一个事后显而易见的问题,但是否有一种选项可以拒绝在字典中找到的密码?我并不特别询问Unix变体。 - Steven Sudit
@Steven Sudit:你可以使用cracklib来实现这个目的。 - hayalci
当然,但这是否集成到密码更改系统中呢? - Steven Sudit
1
如果PAM堆栈中包含pam_cracklib.so,则已集成。 - hayalci

1

没有盐,攻击者可以为他字典中的每个单词生成哈希值,然后将新字典与您的密码列表进行匹配。

有了盐,每个密码都会使用随机字符串进行哈希处理,因此即使具有先前哈希字典知识,攻击者仍必须重新创建一个包含数据库中每个不同盐的新哈希字典。

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

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


我不确定那是否完全正确。暴力破解意味着在可能的密码空间中进行顺序或随机搜索。有盐后,攻击者仍然可以将盐和哈希应用于字典,但他们必须选择一个单一的盐值来执行此操作,而且他们不会事先随意拥有该值,因此他们必须实时计算出该值。 - Steven Sudit

0

你的逻辑是正确的,但实际上,如果有足够的计算能力和时间,就没有防御字典/暴力攻击的保护措施。


也许在足够的时间和计算能力下,没有任何防护措施可以抵御暴力攻击。然而,使用一个不在任何字典中的密码就足以保护你免受任何字典攻击。 - Steven Sudit
好的观点,但是训练用户选择安全密码本身就需要付出努力。 - farinspace

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接