我一直在研究存储盐,显然最常用的方法是将它存储在与用户名和密码相同的表中的单独列中。我已经看到了这个和其他网站,但对我来说这就像把钥匙放在保险箱旁边。如果任何人都可以访问身份验证表,黑客就会获胜。如果他们这样做,但在那里找不到盐,他们就没有那么多了。
我操作一个三层系统,并且更喜欢某种方法将盐存储在Java操作的中间层上,该中间层位于防火墙之后,无法直接从Internet访问。也许是某些XML或应用程序的其他部分都不会触及的东西?
答案 0 :(得分:2)
那么让我们回顾一下盐的含义。 这是确保
的一种方式9MpQfAfQvTG8d5oIdWgmpv2d2X1DrCXkspoJM6vqA / M =
攻击者无法在泄漏之前预先计算攻击列表,然后几乎立即将其结果的“彩虹表”与泄漏相匹配,以消除整个预先计算的列表,然后继续破解硬密码而不浪费宝贵的时间在容易的。
因此,如果我们的攻击者的密码列表为“password”和“12345”,并且您没有使用salt,那么他们已经发现上述设置的结果是:
9MpQfAfQvTG8d5oIdWgmpv2d2X1DrCXkspoJM6vqA / M =
和
I2bEyBbaxTBvHdJ7rIu7kdR2liwGMCg62lyuoj41NB8 =
因此,攻击者获取了您的密码列表,并且他们几乎立即消除了在您的许多用户选择可怕密码上花费任何计算时间,这意味着他们有更多的时间和组合留下来尝试更高的难度目标。
如果为每个用户标识使用16字节加密随机盐,则不必为列表中的每个密码*规则执行一次哈希算法,它们必须每次执行2 ^ 128次,这在计算上是不可行的,更不用说存储要求了。
保持盐的秘密是没有意义的 - 它可以满足这两个目的,而不需要比密码哈希本身更多的保密。