Security Bcrypt更长的密码

Security Bcrypt更长的密码,security,hash,passwords,bcrypt,Security,Hash,Passwords,Bcrypt,所以Bcrypt对密码的长度有限制。关于这一点,我读了很多页。有一件事我搞不清楚,那就是大多数网站是如何绕过这一点的 我注意到的大多数网站没有最大密码长度。也许我完全错了,但这正是我所注意到的。Bcrypt似乎是这类东西最流行的库之一 那么,所有这些网站都只是没有提醒用户,而Bcrypt正在将密码削减到最大字符限制,并且没有提醒用户?或者他们正在做一些特殊的技术来允许更长的密码 我只是想弄清楚如何最好地实现这一点。我希望没有最大字符限制。但同时,我想直截了当地告诉用户,如果Bcrypt正在削减密

所以Bcrypt对密码的长度有限制。关于这一点,我读了很多页。有一件事我搞不清楚,那就是大多数网站是如何绕过这一点的

我注意到的大多数网站没有最大密码长度。也许我完全错了,但这正是我所注意到的。Bcrypt似乎是这类东西最流行的库之一

那么,所有这些网站都只是没有提醒用户,而Bcrypt正在将密码削减到最大字符限制,并且没有提醒用户?或者他们正在做一些特殊的技术来允许更长的密码

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


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

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

根据NIST SP 800-63-3文件数字认证指南草案,密码应接受并使用至少64个字符,如果接受更多,则不得截断

事实上,NIST建议将PBKDF用于SHA-1、SHA-2系列、SHA-3系列中的任何一种,即使使用SHA-1,基本上也不会发生冲突,即使存在冲突,也不会出现密码哈希问题。关键是减缓攻击者速度的迭代次数


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

即使问题已经得到了回答,我想指出两件事:

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

对72个字符的密码进行哈希运算就足够安全了。即使是20个字符的密码也不能被强制使用

72个字符的密码将允许1E129组合,无特殊字符。非常快的哈希值可以用100Giga/秒计算。即使在这种最坏的情况下,你也需要大约110年的时间来预期匹配,即大约10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000倍于宇宙年龄

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

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

还有一些陷阱:

如果使用SHA-512的二进制输出,则可能会在\0个字符上出错,这可能导致不安全的哈希,请参见此。 如果使用SHA的十六进制/base64表示形式,则会限制72个位置的可能字符。
你在哪里发现bcrypt有一个最大长度?@Sylwit我已经做了测试来证明它。例如,在Node.js中,我注册了一个100个字符的密码,然后尝试只输入前75个字符就可以登录,然后它会作为有效密码返回。我也不知道。那么sha-512密码和bcrypt呢?“你会在72个字符以下吗?”西尔维特说。所以,尽管这会奏效,但我听很多人说,这是一个非常糟糕的主意。我在这里问了一个没有引起太多注意的问题。而那个人说,在这之前把它搞乱并不是最聪明的主意。不知道为什么。但我在很多地方都听说过。“我猜是因为可能会有更多的重叠还是什么?”扎夫说。我想知道为什么有些人会说这在实践中不是一个好主意。谢谢你的帮助!请随意回答,我会投票表决。很酷,在将其传递到Bcrypt之前,只需运行SHA-512或类似的程序,然后确保Bcrypt迭代计数足够高,这对auth来说基本上是一个不错的策略?它应该是一个相当好的散列,SHA-512的SHA-256应该可以。在设计这个时,我还应该考虑其他一些重要的提示吗?我知道我现在真的偏离了我原来的问题的主题,但还有什么其他重要的提示或我应该注意的事情吗?你应该尝试使用一个迭代计数,这样Bcrypt大约需要100毫秒,如果必要的话,由于测量的性能考虑,需要更少。似乎将密码截断为72个字符不是最好的主意。首先通过SHA或某种类型的散列来传递它似乎是最好的解决方案。好的,最好的方法就是让Bcrypt在72个字符后剪切它。这有点让人扫兴。希望有更好的出路。@CharlieFish-除非你确切知道自己在做什么,否则我认为这是最好的选择。事实上,这绝不是一个问题。基于专门出版物800-63-3:数字认证的当前规范草案
指导原则密码不应被截断。可以将密码限制为64个字符,但最好允许更长的密码。2.密码不是强制的,而是使用密码列表,按频率排序的10M密码是常见的。2.唯一性将通过初始散列来实现。@zaph-字典只是短密码的问题,它们对于72+密码是毫无疑问的,但您当然知道这一点。我之所以选择MD5是因为它属于最坏的情况,是为了说明即使是最快的散列的一次迭代,72个字符的限制也决不是问题。您关于使用迭代PBKDF2可以使MD5变慢的评论仅支持此语句。