首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >密码最大长度与bcrypt,河豚

密码最大长度与bcrypt,河豚
EN

Stack Overflow用户
提问于 2014-07-15 06:27:24
回答 2查看 12.3K关注 0票数 9

我的问题来自于这个How to hash long passwords (>72 characters) with blowfish

我正在使用bcrypt(河豚)散列密码。所以,我从这个问题中发现了https://security.stackexchange.com/questions/39849/does-bcrypt-have-a-maximum-password-length

它的字符限制为72。

所以,我开始考虑限制密码的最大长度,但是在这些问题和答案之后。

https://security.stackexchange.com/questions/33470/what-technical-reasons-are-there-to-have-low-maximum-password-lengths

Why restrict the length of a password?

Should I impose a maximum length on passwords?

所有的话都是反对的。提到一些事情,比如

  • 存贮
  • 旧的Unix系统经验
  • 与不支持长密码的遗留系统的交互
  • 公约(即“我们总是这样做”)
  • 单纯的天真或无知。
  • 存储在纯文本
  • 另外,a maximum length specified on a password field should be read as a SECURITY WARNING,通过这个答案- https://stackoverflow.com/a/99724/932473

因此,我不认为我与其中一个案件相匹配。当然,我同意愚蠢的限制,例如最大长度为10,甚至更糟的是,8或6,但密码(加盐的) 30、40或更长不安全吗?从这篇文章中(虽然有点老了),但它说

代码语言:javascript
运行
复制
it can make only 71,000 guesses against Bcrypt per second

http://arstechnica.com/security/2012/12/25-gpu-cluster-cracks-every-standard-windows-password-in-6-hours/

这是8个字符密码。因此,我想象自定义的彩虹表将有多大-强制只有一个或更多的字符密码(考虑到每个密码都有它自己的盐),因为彩虹表的大小呈指数增长。

引用同一篇文章的评论

每次你在密码中添加一个字符,你都会成倍地增加通过暴力破解密码所需的难度。例如,8字符密码的密钥空间为95^8组合,而20字符密码的密钥空间为95^20组合。

因此,对于一个带有bcrypt的20长密码,需要95^20 / (71 000 * 3600 * 24 * 365)到10度的28度年(如果我做对了)。

qsn1:,在这种情况下,使用河豚是否意味着不将密码的最大长度限制为72,因为在此之后,所有内容都将被截断,因此这里没有额外的安全增益。

qsn2:即使salt存在(对于每个用户都是唯一的,并且保存在db中),毕竟我想在密码中添加胡椒(在应用程序中硬编码,而不是在db中保存)。我知道是否会增加一些额外的安全性,但我考虑的是如果db (或db备份)只是泄漏,胡椒将是有用的。因此,为了能够添加20个字符胡椒,我需要使密码最大长度到大约50。我想是这样的:假设用户正在使用70个字符,在大多数情况下(如果不是全部的话),它将是一些短语或类似的词,而不是生成强的,所以限制用户50最大长度,再添加一个20-22字符胡椒,这肯定更安全/随机。此外,让我们说,黑客正在使用彩虹表的“常见短语”,我认为有更高的机会,72 character common phrase将被黑,比50 character common phrase + 22 character random string。那么,这种方法与胡椒和50最大长度更好,还是我做错了,它是最好留下72最大值限制(如果qsn1是好的)?

谢谢

BTW:

根据Owasp,密码的合理最大长度为160 credentials

google的密码最大长度为100。

Wordpress的最大限制为50

https://signup.wordpress.com/signup/

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-15 07:13:02

问题1:根本没有理由限制密码长度,BCrypt可以处理更长的密码,尽管只使用了72个字符。你根本没有优势,但理论上你会阻碍密码管理器使用更长密码的人。如果将来切换到另一种算法,限制可能会有所不同,因此没有理由限制72个字符。

问题2:,而不是挑剔,您可以更好地使用另一种方法:使用服务器端密钥加密密码哈希。添加胡椒的原因是,攻击者必须获得服务器上的特权,因为如果没有密钥,他就无法开始野蛮操作--强制使用散列(数据库的SQL注入或抛出备份是不行的)。与加密(双向)哈希有同样的优势。

  1. 这样您不需要为胡椒保留字符,您可以使用所有72个字符的密码。
  2. 与胡椒不同的是,只要有必要,服务器端的密钥就可以交换。胡椒实际上成为密码的一部分,在下一次登录之前不能更改。
  3. 另一个discussed点是,胡椒在理论上可能会干扰哈希算法.
票数 7
EN

Stack Overflow用户

发布于 2018-01-19 20:23:31

除了简单的散列用户提供的密码,还有其他用例希望使用bcrypt安全散列任意长的字符串。在将密码传递到bcrypt以获得更高的熵之前,您也可能希望先对密码进行加盐。

我用来绕过字符限制的一个算法是使用中间散列。因此,我没有直接散列密码,而是使用更弱的散列机制,在bcrypt的长度限制范围内生成一个较短的字符串,然后使用bcrypt对中间字符串进行散列。中间哈希不必像bcrypt那样是强散列,但是如果使用高度随机和长的盐分,则这种方法的有效性将最大化。我当前的中间哈希是sha512。

我用于散列密码的步骤如下:

  1. 使用/dev/urandom等源生成一个长的加密安全盐。(每个用户都这样做。你也可以附加一个应用程序范围的盐,如果你愿意的话。如果您计划在将来进行密码验证,则需要存储此盐类。
  2. 将salt连接到用户提供的密码。
  3. 将级联的值输入sha512并捕获结果,这将是一个128个字符字符串,表示一个十六进制数字。
  4. 要添加熵并使用整个中间盐,循环遍历整个sha512哈希,获取一对十六进制数字,将该对的值转换为ascii字符,并使用每个字符构建一个压缩的中间散列,长度为64个字符,其中有256个可能的字符。
  5. 使用首选参数(如成本)将最后压缩的中间哈希输入bcrypt,并捕获结果哈希。
  6. 现在您有了一个安全的散列,它利用了您的长密码的全部值。
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24751279

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档