良好的做法是不要不必要地限制密码长度,以便可以使用适当长度的密码(对于 6/7 的骰子字来说可能是 35-45 个字符)。(请参阅例如我应该有一个最大密码长度吗?建议最大为 1K,以防止 DoS 而不会限制用户设置长密码的能力。)
bcrypt 也被普遍推荐(参见例如Do any security expert recommend bcrypt for password storage?,http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you -需要知道-关于-s.html )
还建议使用盐(随机,并与密码哈希一起存储)——我相信通常建议使用 32 位(4 个字符)。(我理解 salt-size 的基本原理是“足够组合的数量比用户记录的数量大得多,并且足以使彩虹表变得不可行”——16 位对于第二部分来说就足够了,但可能不是第一次就够了。)
但 AIUI bcrypt 仅散列 55 个字节——盐分 4 个字符,密码留出 51 个字符。
我猜我们不应该只 bcrypt(left(password,51)) 而忽略最后一个字符。
我们是否应该将用户的密码限制在 50 个字符以内(对几乎每个人来说都足够了,但绝对不够)?
我们是否应该改用 bcrypt(sha256(salt+password)) 之类的东西,并允许最多 1K 个字符?还是添加 sha256(或 sha512?)步骤会以某种方式降低整体安全性?
scrypt 或 PBKDF2 是否有类似的长度限制?
(最后一个问题只是为了兴趣,真的——我意识到空间硬度/FPGA 阻力,scrypt 的相对新颖性,以及 bcrypt 与 PBKDF2 相比的 GPGPU 阻力是决定使用哪个散列时更重要的考虑因素。利用。)