2012-02-09 106 views

回答

0

盐使加密更强。然而,字典攻击不会尝试解密密码哈希,因此无论是否加盐,都无关紧要,他们只会尝试很多密码,直到有效。

+0

这是不正确的。首先,我认为你的意思是盐让哈希更强。大多没有理由使用Salt加密。盐被用作单向函数的输入之一,以使它更难破解密码或密码数据库。另外,如果您使用盐进行字典式攻击,这一点很重要。如果你不使用salt,黑客只需要对每个密码猜测进行一次散列,并将其与所有散列进行比较,而在使用盐的情况下(每个密码都有一个单独的盐),你不能这样做。 – Rutix 2012-02-11 15:47:02

1

如果'攻击者'有你的站点/应用程序使用的密码哈希(和盐),他们将只是蛮力“盐”+“密码”。

但是,使用盐对彩虹表(预先计算的散列表)提供更多保护,因此它们仍值得使用。

+0

但是攻击者在发现匹配后如何知道哪一部分是盐,哪一部分是真正的密码? – 2012-02-09 23:28:21

+0

如果您的站点/数据库已经被攻击者足够的入侵以获取用户散列密码,他们可能也会访问salt。 – pjumble 2012-02-09 23:35:28

0

这属于上security.stackexchange.com

的问题是结合散列算法的速度计算能力之一。基本上,他正在投入慢速的bcrypt。

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

如果使用非常快速的算法,那么这段时间很短。如果使用非常慢的算法,那么显然,找到命中的时间要长得多。

这给我们带来了首要原因:我们首先散列/盐的东西:买时间。可以使用这些时间来更改列出的所有密码,并有时间与所有用户联系,以便在需要更改其他系统上的密码时通知他们。

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

无论使用何种机制,哈希密码在大多数人都接受这个词的意义上是不安全的。安全并不意味着“永远不会被破解”。相反,这意味着“在时间/努力破解方面这将是昂贵的”。对于大多数黑客来说,他们只需要清晰的文字等低挂水果。对于一些人来说,他们会去任何需要的极端,比如按照盐的价值建造大量的彩虹桌子,以获得全部的彩虹。

而且,当然,支撑这一点的是在用户表中是否容易识别任何“超级”用户帐户。对于大多数系统来说,破解系统管理员帐户类型就足够了,因此每个用户使用不同盐值的事实并不重要。聪明的人只会为这个帐户感到困扰。

0

这不完全准确,因为大部分事情取决于您的假设。

主要假设是:

  1. 攻击者有盐“对飞”散列
  2. 计算完成相当快(如盐,他将需要重新计算一切,将无法使用预定义列表)
  3. 每个用户的盐份相同。
1

盐通过彩虹桌防止从字典中即时破解;该文章和后续文章指出,CPU /存储器的折衷现在是彩虹表没有意义,因此盐不能帮助你。当然,他们从来没有帮助过暴力攻击。

+0

-1腌制对抗彩虹餐桌上的暴力攻击同样有效!但盐必须是未知的。为了防止重复密码哈希,许多系统使用独特的盐。然后将其包含在数据库中。如果一个数据库泄漏了,那么这个盐几乎是无用的。添加第三个应用程序特定盐。是一种有效的解决方案,但不能将其存储在数据库中或其无用的代码中。当然,如果黑客有权访问文件系统,那么您又有困难 – DeveloperChris 2013-05-28 03:43:47

-1

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

腌制的目的是在像哈希,这是单向的功能,以帮助在密码学中广泛使用,由于难以猜测密码常常使用密码,而其他攻击(如暴力破解攻击)则需要时间来破解密码。

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

+0

-1。如果你不需要恢复密码,你绝对不希望对它们进行加密,但想要散列(或者,甚至更好地使用类似bcrypt的散列)。但是......永远不要加密,这是可逆的,除非你真的需要恢复明文密码(这不是一个非常常见的用例)。 – jeffsix 2012-02-09 23:57:19

+0

我假设他想存储他的密码供以后使用/访问,这就是为什么我建议加密,如果他不想因任何原因恢复它,像哈希这样的单向函数绝对是一种方法。如果你打算-1,确保你明白我的意思。当我说安全存储时,我的意思是存储以供以后使用/恢复。 – Ipquarx 2012-02-10 00:14:15

0

两点意见:

  1. 常规的哈希算法可以重复。仅仅因为你想增加工作因子就不需要使用非标准算法。

  2. 即使使用慢散列方法,也建议使用盐。它可能不一定会增加最佳攻击的工作负载,但在用户选择与另一用户,另一个帐户或旧密码相同的密码时,它将停止微不足道的攻击。

5

对于单个密码,它没有多大区别。暴力破解密码与暴力破解密码一样困难。你只需要尝试按键,直到你受到打击。

当存在大量密码时(例如在泄漏的数据库中)时,会出现差异。基本思想是,在破解很多密码时,可以重新使用部分必要的计算。这是通过构建彩虹桌完成的。这样做的计算成本很高,但一旦完成,攻击者就可以相对快速地破解大量密码。用彩虹表破解N密码要比单独强制密码更加快速。

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

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

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

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' 

此后你会保存散列和盐在数据库中,像

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

我们假设一个COM承诺的系统攻击者可以访问你的代码 - 所以他知道你是如何计算你的哈希值的。
攻击者也可以访问你的数据库,所以他拥有所有的密码哈希和盐。

鉴于这一信息,为了做破解您的密码(其中有一个哈希:“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种盐来尝试每个单词。

因此,得出结论:

  • 盐是不错的。他们让你的密码难以破解。即使你的用户输入了弱密码,盐也会确保所产生的哈希不可用。例如,它很容易谷歌一个散列'3cc31cd246149aec68079241e71e98f6'这实际上是一个相当复杂的密码,并将满足几乎所有的密码策略。仍然破解它不需要一行代码!

  • 盐不是万能的。它们只会增加黑客破解密码所需的时间。但是,如果你的salt地址空间相当大,那么你很好。例如,如果你有32个字符的字母数字字符串作为盐 - 蛮力真的需要很长时间。

  • 像bcrypt这样的慢速算法在这方面帮助你,只是因为它们很好...'慢'。对于蛮力攻击来说,打破计算速度慢的哈希需要很长的时间。