关于盐,我们有两种相互矛盾的理论。我开发的产品使用类似于用户名或电话号码的东西来加盐散列。从本质上说,这些对于每个用户都是不同的,但是对于我们来说是可用的。另一个产品随机为每个用户生成一个 salt,并在用户每次更改密码时进行更改。然后在数据库中对 salt 进行加密。
我的问题是,第二种方法是否真的有必要?我可以从纯理论的角度来理解,它比第一种方法更安全,但从实用性的角度来看呢。现在,要对用户进行身份验证,必须解密 salt 并将其应用于登录信息。
仔细考虑之后,我并没有从这种方法中看到真正的安全收益。即使攻击者知道如何快速确定每个帐户的结果,将 salt 从一个帐户更改为另一个帐户,仍然会使某人极难强制执行散列算法。这是在假设密码足够强的前提下进行的。(显然,找到一组密码的正确哈希值,如果它们都是两位数字,要比找到正确的哈希值(8位数字)容易得多)。是我的逻辑错了,还是我漏掉了什么?
编辑: 好的,这就是为什么我认为加密 salt 毫无意义的原因。(让我知道我是否在正确的轨道上)。
对于下面的解释,我们假设密码总是8个字符,salt 是5,并且所有的密码都由小写字母组成(这使得计算更容易)。
对每个条目使用不同的盐意味着我不能使用相同的彩虹表(实际上,如果我有一个足够大的,我可以使用彩虹表,但让我们暂时忽略它)。根据我的理解,这才是真正的关键,因为要破解每一个账户,我必须重新发明轮子,这样才能代表每一个账户。现在,如果我知道如何将正确的 salt 应用于密码以生成散列,我会这样做,因为 salt 实际上只是扩展了散列短语的长度/复杂度。所以我需要减少可能需要生成的组合的数量来“知道”密码 + salt 从13 ^ 26减少到8 ^ 26因为我知道 salt 是什么。这样就简单多了,但还是很难。
所以要加密盐。如果我知道 salt 是加密的,我就不会首先尝试解密它(假设我知道它有足够级别的加密)。我会无视它。我没有尝试解密它,而是回到前面的例子,我只是生成了一个更大的彩虹表,其中包含了13 ^ 26的所有密钥。不知道盐的存在肯定会拖慢我的速度,但我不认为这会增加首先破解盐密码的艰巨任务。所以我觉得不值得。有什么想法吗?
下面的链接描述了密码在穷举法下能保存多长时间: Http://www.lockdown.co.uk/?pg=combi