盐需要多长时间才能使字典攻击变得不可行?

Wil*_*gan 14 security encryption passwords cryptography salt

我正在设计一个如下所示的身份验证系统:

  1. 用户输入密码
  2. 生成盐.
  3. 密码与漩涡进行哈希处理
  4. 惠而浦密码与普通盐连接密码
  5. 连接版本使用sha1进行哈希处理并存储在数据库中.
  6. 我通过在应用程序层上散列密码来检查密码是否正确,然后执行此操作(在MySQL中):

MySQL的

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字节不会伤害,当然,这没有什么不妥.

但是,如果你想使蛮力或字典攻击不可行,那么使用更长的盐就无济于事了.相反,让您的用户选择强密码并考虑使用键拉伸.

  • 盐不会显着减缓针对单个用户的攻击,但它们确实会减缓针对大型数据库的攻击。考虑拥有一个无盐数据库,现在您从通用密码开始,计算一次哈希值,然后针对整个数据库进行检查。然后进入下一个常用密码。这不适用于盐。 (2认同)

Mar*_*ins 8

我的版本Cryptography(Ferguson,Schneier)的版权日期为2003,建议使用256位(32字节)的盐长度.它说128位"可能"还可以,但是,正如它指出的那样,位很便宜.鉴于此,对于每个密码,在磁盘上存储64字节的相对最小的成本似乎是合理的.这可能是矫枉过正,但不会受到伤害.

您可能还需要考虑密码拉伸(多次重复散列函数)以增加通过强力攻击密码的计算复杂性.增加几百毫秒来检查密码的成本会大大增加暴力攻击的成本.

  • 嗯,这并没有使它正确,这种使用必然会引起不熟悉密码学的读者的混淆.加强键是指定高迭代次数时的操作.当您需要特定长度的派生键时,键拉伸就是您所做的.如果使用PBKDF生成用于AES-256-CBC加密的256位密钥,则表示您已执行密钥扩展,但不一定是密钥强化.您不一定得到256位安全性,因为派生密钥是256位. (2认同)