Wil*_*gan 14 security encryption passwords cryptography salt
我正在设计一个如下所示的身份验证系统:
WHERE `Password` = SHA1(CONCAT('$hashedPassword',`Salt`)) AND [..]
Run Code Online (Sandbox Code Playgroud)
目前我的盐是64字节.这足以使词典攻击变得不可行吗?
我确定sha1已知漏洞,但它是我可以在数据库层使用的我的MySQL(5.1)版本上唯一可用的功能,而不是通过应用程序和数据库层之间的连接选择普通的盐.
Nik*_* B. 19
我认为你误解了盐的概念.盐不会显着阻止或减缓字典和暴力攻击.
使用salt的全部意义在于避免某人已经为您的密码哈希预先计算了字典/暴力攻击(例如使用彩虹表).因此,它只需要足够长以排除这种表已存在于特定盐的可能性.
考虑到这种彩虹表的典型尺寸,有些人已经预先计算了这样的表,即使是8字节左右的小尺寸盐(考虑可能的盐的数量:) 256^8 = 18446744073709551616.前提当然是盐是随机生成的,并且您不会多次使用相同的盐值.64字节不会伤害,当然,这没有什么不妥.
但是,如果你想使蛮力或字典攻击不可行,那么使用更长的盐就无济于事了.相反,让您的用户选择强密码并考虑使用键拉伸.
我的版本Cryptography(Ferguson,Schneier)的版权日期为2003,建议使用256位(32字节)的盐长度.它说128位"可能"还可以,但是,正如它指出的那样,位很便宜.鉴于此,对于每个密码,在磁盘上存储64字节的相对最小的成本似乎是合理的.这可能是矫枉过正,但不会受到伤害.
您可能还需要考虑密码拉伸(多次重复散列函数)以增加通过强力攻击密码的计算复杂性.增加几百毫秒来检查密码的成本会大大增加暴力攻击的成本.