在工作中,我们有两种关于盐的竞争理论。我所从事的产品使用类似用户名称或电话号码之类的东西来为哈希生成器加盐。实质上,每个用户都不同但对于我们来说很容易获取。另一个产品为每个用户随机生成一种盐,并在用户更改密码时更改它。然后在数据库中加密这个盐。
我的问题是,第二种方法真的必要吗?从纯理论角度来看,我可以理解它比第一种方法更安全,但从实用角度来看呢?现在,要认证一个用户,必须解密盐并应用于登录信息。
经过思考,我并没有看到这种方法的真正安全收益。即使攻击者知道如何快速确定每个账户的盐,仍然将盐从一个账户更改到另一个账户,即使找到正确的哈希也会变得非常困难。这建立在密码足够强大的假设下。(显然,在所有密码都是两位数的情况下,找到一组密码的正确哈希值要比找到所有8位数密码的正确哈希值容易得多)。我的逻辑是错误的吗,还是我漏掉了什么东西?
编辑:好的,这就是为什么我认为加密盐很无意义的原因(让我知道我是否正确)。
为了说明问题,我们假设密码始终为8个字符,盐为5个字符,并且所有密码都由小写字母组成(这只是使数学更容易)。
每个条目都有不同的盐,这意味着我无法使用相同的彩虹表(实际上从技术角度来看如果我拥有足够大的彩虹表是可以的,但让我们暂时忽略这一点)。据我所了解,这正是盐的真正关键,因为要破解每个帐户,我必须为每个帐户重新发明密码破解方法。如果我知道如何将正确的盐应用于密码以生成哈希值,我会这样做,因为盐只是扩展了哈希短语的长度/复杂性。所以,我将需要生成的“知道”我有密码+盐的可能组合数量从13 ^ 26减少到8 ^ 26,因为我知道盐是什么。现在这使它更容易,但仍然非常困难。接下来是加密盐。如果我知道盐已经加密,我就不会先尝试解密它(假设我知道它具有足够的加密级别)。我会忽略它。回到前面的例子,我将生成一个包含所有13 ^ 26键的更大的彩虹表。不知道盐肯定会减慢我的速度,但我认为它并没有增加尝试首先破解盐加密的巨大任务。这就是为什么我认为这不值得的原因。你有什么想法?
这里有一个链接,描述了在蛮力攻击下密码能够保持多长时间: http://www.lockdown.co.uk/?pg=combi