我正在使用bcrypt(blowfish)来哈希密码。因此,我从这个问题中发现它有一个72个字符的限制:https://security.stackexchange.com/questions/39849/does-bcrypt-have-a-maximum-password-length。
因此,我开始考虑限制密码的最大长度,但在阅读了这些问题及其答案后,我决定不要这样做。
所有这些都是反对的。提到了一些事情,比如
- 节省存储空间
- 旧的Unix系统经验
- 与不支持长密码的旧系统的交互
- 惯例(即“我们一直这样做”)
- 简单的幼稚或无知。
- 以明文形式存储
- 此外,
在密码字段上指定的最大长度应被视为安全警告
,来自这个答案 - https://dev59.com/1XVD5IYBdhLWcg3wE3Ro#99724 - 等等
所以,我不认为我符合这些情况之一。当然,我同意像最大长度为10这样的愚蠢限制,甚至更糟的是8或6,但是长度为30、40或更多的密码(加盐)不被视为安全吗? 从这篇文章中可以看到(尽管有点旧),但它说
it can make only 71,000 guesses against Bcrypt per second
对于8个字符的密码,需要一个巨大的自定义彩虹表来暴力破解一个30个或更多字符的密码(考虑到每个密码都有自己的盐),因为彩虹表的大小呈指数增长。
同一篇文章的评论中引用:
每增加一个字符,您就会以指数方式增加通过暴力破解破解密码所需的难度。例如,8个字符的密码具有95^8个组合的密钥空间,而20个字符的密码具有95^20个组合的密钥空间。
因此,对于使用bcrypt的一个20个字符长度的密码,根据该公式需要10的28次方年才能破解(如果我做对了的话)。
问题1:在这种情况下,对于blowfish,是否有意义不将密码最大长度限制为72,因为在任何情况下,超过该长度的所有内容都将被截断,因此在此处没有额外的安全性提升。
问题2: 即使盐存在(对于每个用户都是唯一的,并保存在数据库中),我仍然想将胡椒粉(硬编码在应用程序中而不是保存在数据库中)添加到密码中。我知道这会增加一点额外的安全性,但我认为如果仅泄漏了数据库(或数据库备份),胡椒粉也会有用,以防万一。
https://security.stackexchange.com/a/3289/38200
因此,为了能够添加比如20个字符的胡椒粉,我需要将密码最大长度设为约50个字符。我这样想:假设用户正在使用70个字符,在大多数情况下(如果不是全部情况),它将是一些短语之类的东西,而不是生成的强密码,因此限制用户最大长度为50并添加另外20-22个字符的胡椒粉肯定更安全/随机。此外,假设黑客正在使用“常见短语”的彩虹表,我认为被破解的72个字符的常见短语
的机会更高,而不是50个字符的常见短语+22个字符的随机字符串
。那么,使用胡椒粉和50个最大长度的方法是否更好,还是我做错了什么,最好保留72个最大限制(如果qsn1没问题)?
谢谢
顺便说一下:
根据Owasp的规定,密码的合理最大长度为160 https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet#Do_not_limit_the_character_set_and_set_long_max_lengths_for_credentials
谷歌的密码最大长度为100