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

Security 为什么salt在使用字典攻击时没有帮助,security,hash,saltedhash,Security,Hash,Saltedhash,从本网站: 需要注意的是,盐对于防止字典攻击或暴力攻击是无用的 如果盐对防止字典攻击无效,为什么要使用盐 盐使加密更强大。然而,字典攻击不会试图解密密码散列,所以不管是盐还是无盐,它们只会尝试许多密码,直到其中一个密码生效。如果“攻击者”拥有你的站点/应用程序使用的密码散列(和salt),他们只会强行使用“salt”+“password” 但是,使用salt可以更好地保护rainbow表(预先计算的哈希表),因此它们仍然值得使用。这属于security.stackexchange.com 问题是

从本网站:

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


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

盐使加密更强大。然而,字典攻击不会试图解密密码散列,所以不管是盐还是无盐,它们只会尝试许多密码,直到其中一个密码生效。

如果“攻击者”拥有你的站点/应用程序使用的密码散列(和salt),他们只会强行使用“salt”+“password”


但是,使用salt可以更好地保护rainbow表(预先计算的哈希表),因此它们仍然值得使用。

这属于security.stackexchange.com

问题是计算能力与哈希算法的速度的结合。基本上,他投球的速度很慢

如果黑客同时使用了hash和salt,并且知道用于对密码进行hash的算法,那么破解密码只是时间问题

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

这就引出了我们为什么要把事情放在第一位的主要原因:争取时间。更改列出的所有密码所需的时间,以及在需要更改其他系统上的密码时联系所有用户让他们知道的时间

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

散列密码,无论使用何种机制,在大多数人接受这个词的意义上都是不安全的。安全并不意味着“永远不会被破解”。相反,这意味着“这将是昂贵的时间/努力来破解”。对于大多数黑客来说,他们只想要像明文这样的低挂果实。对一些人来说,他们会走到任何需要的极端,比如每盐值建一个巨大的彩虹表来获得所有的盐


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

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

主要假设是:

  • 攻击者有盐
  • 哈希计算“在运行中”完成得相当快(与salt一样,他需要重新计算所有哈希,并且不能使用预定义的列表)
  • 每个用户的食盐相同

  • 盐可以防止字典通过彩虹表瞬间破裂;这篇文章和后续文章指出,CPU/存储之间的权衡现在已经变得毫无意义,所以盐类也帮不了你。当然,他们从来没有帮助过暴力攻击。

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

    satting的目的是帮助实现单向函数,如散列,散列在密码学中被广泛使用,由于密码很难猜到,因此经常使用密码,以及其他攻击(如暴力攻击)破解密码所需的时间

    如果您想安全地存储密码,最好的方法肯定是加密。有关这方面的更多信息,请在维基百科上查找加密。

    两条评论:

  • 常规哈希算法可以迭代。没有必要仅仅因为想要增加功因数就使用非标准算法

  • 即使使用慢速散列方法,也建议使用Salt。它可能不一定会增加最佳攻击的工作负载,但当用户选择与另一用户、另一帐户或旧密码相同的密码时,它将停止普通攻击


  • 对于单一密码,它没有多大区别。暴力强制使用未加盐的密码和暴力强制使用加盐的密码一样困难。你只要试一下钥匙,直到找到为止

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

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

    对于非安全密码和流行的散列算法,您只需从Internet下载预先计算的彩虹表,这样攻击者甚至不必自己计算它们。他可以下载一个表并查找特定哈希的密码。盐可以防止这种情况


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

    为了便于说明,假设您使用2个字符串作为salt,它可以是集合中的随机元素
    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 | | . | . | | . | . | +--------------------+------+
    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