【问题标题】:Does a hash salt have any other use than to prevent rainbow table attacks?除了防止彩虹表攻击之外,哈希盐还有其他用途吗?
【发布时间】:2010-03-03 01:04:05
【问题描述】:

我听说盐的唯一目的是防止彩虹表攻击,但它肯定比这更有价值吗?它不会也阻止基于字典的攻击吗?那么暴力破解呢,盐在那里有用吗?你能解释一下为什么吗?

其次,假设我有一个算法,它采用微时间、128 个字符的盐和 10 亿到 100 亿之间的随机数,并将它们散列在一起。这会提供高水平的安全性吗?因为即使攻击者知道其中一个细节,在我看来,计算其余部分在计算上仍然是不可行的。不过这样对吗?

谢谢,

编辑:为了澄清,攻击者无权访问散列算法,因此他们无法向系统发送任何垃圾信息。他们所拥有的只是哈希,他们必须弄清楚它是如何编译的。当然,即使他们知道哈希是如何生成的,尝试暴力破解所有长盐的组合也会变得不切实际?

此外,哈希不是用户的密码或用户名,它只是用于身份验证的一组随机字符。所以不需要存储盐和随机数,只需存储生成的哈希即可。在这种情况下,上述系统(如以下代码所示)是否是一个很好的系统,可以防止攻击者能够真实地猜测用户的哈希值可能是什么?

$salt = "some random characters I made up";
hash('sha256', microtime(true).$salt.mt_rand(1000,9999));

我知道这只是 1000-9999,而不是上面提到的数十亿。

再次感谢。

【问题讨论】:

  • 下次登录时,系统如何知道创建密码时的微时间是多少?如果您不存储它,那么您将无法验证登录。如果你确实存储了它,那么它只是盐的一部分,无论如何你都会把盐粘在数据库中。

标签: encryption hash salt rainbowtable


【解决方案1】:

否 - 它只防止彩虹表攻击。由于攻击者需要为每个密码条目构建彩虹表。因为盐添加了一种小香料,可以将密码散列与其他所有散列区分开来。

基于字典的攻击和暴力破解攻击在这里本质上是一回事。加盐并不能阻止这些,因为您的验证算法类似于

plain-text-passwd = 'secret provided by user'
salt = getSalt(username) //looks the salt value up in database based on the users username
hash-password-in-db = getPassword(username) // looks up hashed password bassed on users username
if(hash(plain-text-passwd + salt) == hash-password-in-db) //if true, password is correct

对于基于字典和暴力破解的攻击,plain-text-passwd 的值会被用户发送垃圾邮件,而用户又会使用盐进行哈希处理。所以加盐没有任何作用

其次,假设我有一个算法......

这毫无意义,您需要根据用户信息表存储所有这些信息,其中 5 个字符的盐值用于相同目的。

【讨论】:

    【解决方案2】:

    彩虹表是一种优化方法,可用于字典攻击和蛮力攻击。

    正确使用的盐会使预计算无法用于字典和蛮力攻击。由于彩虹表是一种预计算优化,所以它是一种被盐渍化的优化。

    您的第二个示例实际上只是更长的盐,具有一些较低熵的部分。令人担忧的是,您会区分“随机数”和“盐”,因为盐应该是随机数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2019-11-20
      • 2010-09-30
      • 2018-05-04
      • 2014-04-25
      • 2010-10-25
      相关资源
      最近更新 更多