Bcrypt 更长的密码

Posted

技术标签:

【中文标题】Bcrypt 更长的密码【英文标题】:Bcrypt Longer Passwords 【发布时间】:2017-01-03 15:40:50 【问题描述】:

所以 Bcrypt 确实对密码的长度有限制。我已经阅读了很多关于此的页面。我不明白的一件事是大多数网站是如何绕过这个的。

我注意到的大多数网站都没有最大密码长度。也许我对此完全错误,但这正是我所注意到的。 Bcrypt 似乎是这类东西最受欢迎的库之一。

难道所有这些网站都没有提醒用户,而 Bcrypt 将密码限制在最大字符数限制并且不提醒用户吗?还是他们正在做一些特殊的技术来允许更长的密码?

我只是想弄清楚如何最好地实现这一点。我希望没有最大字符限制。但与此同时,我想对用户直言不讳,如果 Bcrypt 正在削减密码,用户应该知道这一点。

对于如何在实践中处理这个限制有什么建议吗?

【问题讨论】:

你在哪里发现 bcrypt 的最大长度? @Sylwit 我已经做了测试来展示它。例如,在 Node.js 中,我使用 100 个字符的密码进行注册,然后尝试仅输入前 75 个字符即可登录,它会作为有效密码返回。还有security.stackexchange.com/questions/39849/… 不知道。那么 sha-512 密码然后 bcrypt 呢?你会在 72 个字符以下? @Sylwit 所以虽然这可行,但我听到很多人说这是一个非常糟糕的主意。我在这里问了这个问题,但没有引起太多关注security.stackexchange.com/questions/131292/…。这个人说之前散列它不是最聪明的主意。不确定100%为什么。但我在很多地方都听说过。我猜是因为可能会有更多的重叠或什么? @zaph 嗯。我想知道为什么有些人会说这在实践中不是一个好主意等等。谢谢你的帮助!随意回答,我会投赞成票。 【参考方案1】:

我认为第一次运行 SHA-512 没有问题。

根据 NIST SP 800-63-3 草案文档“数字身份验证指南”,密码应接受(并使用)至少 64 个字符,如果接受更多,则不得截断。

实际上 NIST 建议将 PBKDF 与 SHA-1、SHA-2 系列、SHA-3 系列中的任何一个一起使用,即使使用 SHA1 也基本上不会发生冲突,即使存在密码哈希也不会有问题.关键是减缓攻击者的迭代次数。

阅读链接答案中@ilkkachu 的答案评论。

【讨论】:

很酷,所以在将其传递给 Bcrypt 之前运行 SHA-512 或类似的东西,然后确保 Bcrypt 迭代计数足够高基本上是一个不错的身份验证策略? 它应该是一个相当好的哈希值,SHA-256 的 SHA-512 应该可以。 在设计这个时我应该考虑的任何其他主要提示?我知道我现在真的偏离了我原来的问题的主题,但还有其他重要的提示或我应该注意的事情吗? 您应该尝试使用迭代计数,使 Bcrypt 花费大约 100 毫秒,如果需要考虑性能考虑,可以减少。【参考方案2】:

即使问题已经回答了,我还是想指出两点:

    用户可以输入的密码长度不应该被限制,这是正确的。 BCrypt 使用超过 72 个字符的密码没有问题,它只会将密码截断到这个长度。所以接受任意长度的密码,将它们直接传递给 BCrypt 或使用 Zaphs 答案中的方案。

    散列 72 个字符的密码绰绰有余,以确保非常安全。即使是 20 个字符的密码也不能真正被暴力破解。

    72 个字符的密码允许 1E129 组合(没有特殊字符)。可以以 100Giga/秒的速度计算非常快的哈希值。即使在这种最坏的情况下,您也需要大约 1E110 年才能预期匹配,即大约 100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 倍宇宙的年龄!

在组合不同的哈希算法时要注意:

如果操作正确,如果输入的密码超过 72 个字符(这种情况很少发生)并且密码不是随机的(如果有人小心使用这么长的密码,这不太可能),这会增加熵。很多如果。

还有一些陷阱:

    如果您使用 SHA-512 的二进制输出,则可能会遇到 \0 字符,这可能会导致不安全的哈希值,请参阅此 article。 如果您使用 SHA 的 hex/base64 表示形式,您可以限制 72 个位置的可能字符。

【讨论】:

似乎将密码截断为 72 个字符并不是最好的主意。似乎首先通过 SHA 或某种类型的哈希传递它似乎是最好的解决方案。 好的,所以最好的方法就是让 Bcrypt 在 72 个字符后剪切它。这样做真是太可惜了。希望有更好的出路。 @CharlieFish - 除非您确切知道自己在做什么,否则我认为这是最好的选择。真的,这绝对不是问题。 1.根据当前的“特殊出版物 800-63-3 规范草案:数字认证指南”,密码不应被截断。将它们限制为 64 个字符是可以接受的,但最好允许使用更长的密码。 2.密码不是暴力破解,而是使用密码列表,按频率排序的10M密码是常见的。 2.唯一性将通过初始哈希来实现。 @zaph - 字典只是“短”密码的问题,它们对于 72+ 密码是不可能的,但你当然知道这一点。我选择了 MD5,因为它属于最坏的情况,以表明即使对最快的哈希进行单次迭代,72 个字符的限制也不是问题。您关于 MD5 可以通过迭代(PBKDF2)变慢的评论仅支持此声明。

以上是关于Bcrypt 更长的密码的主要内容,如果未能解决你的问题,请参考以下文章

使用 bcrypt 散列密码迁移系统

使用mongoose和bcrypt实现用户密码加密

使用Bcrypt对密码进行加密与解密验证

使用bcrypt在nodejs中进行密码加密

如何将密码文本与 bcrypt 哈希值进行比较?

bcrypt,河豚的密码最大长度