Bcrypt 更长的密码
Bcrypt Longer Passwords
所以 Bcrypt 确实对密码的长度有限制。我已经阅读了很多关于此的页面。我无法弄清楚的一件事是大多数网站是如何绕过这个的。
我注意到的大多数网站都没有最大密码长度。也许我对此完全错了,但这正是我所注意到的。 Bcrypt 似乎是这类东西最受欢迎的库之一。
所有这些网站是否都没有提醒用户并且 Bcrypt 正在将密码减少到最大字符数限制并且没有提醒用户?或者他们正在使用一些特殊技术来允许使用更长的密码?
我只是想弄清楚如何最好地实现它。我希望没有最大字符数限制。但与此同时,我想对用户直截了当,如果 Bcrypt 正在削减密码,用户应该知道这一点。
对于如何在实践中处理此限制有什么建议吗?
我发现第一个 运行 SHA-512 没有问题。
根据 NIST SP 800-63-3 草案文档 "Digital Authentication Guidelines" 密码应接受(并使用)至少 64 个字符,如果接受更多字符则不得截断。
实际上 NIST 建议将 PBKDF 与 SHA-1、SHA-2 系列、SHA-3 系列中的任何一个一起使用,即使使用 SHA1 基本上也不会发生冲突,即使有也不是问题密码散列。关键是迭代计数以减慢攻击者的速度。
阅读链接答案中@ilkkachu 的答案评论。
即使问题已经回答了,我还是想指出两点:
用户可以输入的密码长度应该没有限制,没错。 BCrypt 使用超过 72 个字符的密码没有问题,它只会将密码截断到这个长度。所以接受任何长度的密码,将它们直接传递给 BCrypt 或使用 Zaphs answer 中的方案。
散列 72 个字符的密码绰绰有余非常安全。即使是 20 个字符的密码实际上也不能被暴力破解。
72 个字符的密码将允许 1E129 组合(没有特殊字符)。可以用 100Giga/秒计算非常快的哈希值。即使在这种最坏的情况下,您也需要大约 1E110 年才能期待一场比赛,即大约 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
组合不同的哈希算法时要注意:
如果操作正确,如果输入的密码超过 72 个字符(这种情况很少见)并且密码不是随机的(如果有人注意使用这么长的密码,这种情况不太可能发生) ).很多如果。
还有陷阱:
- 如果您使用 SHA-512 的二进制输出,那么您可能会偶然发现
[=10=]
个字符,这会导致不安全的散列,请参阅此 article。
- 如果您使用 SHA 的 hex/base64 表示,您将限制 72 个位置的可能字符。
所以 Bcrypt 确实对密码的长度有限制。我已经阅读了很多关于此的页面。我无法弄清楚的一件事是大多数网站是如何绕过这个的。
我注意到的大多数网站都没有最大密码长度。也许我对此完全错了,但这正是我所注意到的。 Bcrypt 似乎是这类东西最受欢迎的库之一。
所有这些网站是否都没有提醒用户并且 Bcrypt 正在将密码减少到最大字符数限制并且没有提醒用户?或者他们正在使用一些特殊技术来允许使用更长的密码?
我只是想弄清楚如何最好地实现它。我希望没有最大字符数限制。但与此同时,我想对用户直截了当,如果 Bcrypt 正在削减密码,用户应该知道这一点。
对于如何在实践中处理此限制有什么建议吗?
我发现第一个 运行 SHA-512 没有问题。
根据 NIST SP 800-63-3 草案文档 "Digital Authentication Guidelines" 密码应接受(并使用)至少 64 个字符,如果接受更多字符则不得截断。
实际上 NIST 建议将 PBKDF 与 SHA-1、SHA-2 系列、SHA-3 系列中的任何一个一起使用,即使使用 SHA1 基本上也不会发生冲突,即使有也不是问题密码散列。关键是迭代计数以减慢攻击者的速度。
阅读链接答案中@ilkkachu 的答案评论。
即使问题已经回答了,我还是想指出两点:
用户可以输入的密码长度应该没有限制,没错。 BCrypt 使用超过 72 个字符的密码没有问题,它只会将密码截断到这个长度。所以接受任何长度的密码,将它们直接传递给 BCrypt 或使用 Zaphs answer 中的方案。
散列 72 个字符的密码绰绰有余非常安全。即使是 20 个字符的密码实际上也不能被暴力破解。
72 个字符的密码将允许 1E129 组合(没有特殊字符)。可以用 100Giga/秒计算非常快的哈希值。即使在这种最坏的情况下,您也需要大约 1E110 年才能期待一场比赛,即大约 1000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
组合不同的哈希算法时要注意:
如果操作正确,如果输入的密码超过 72 个字符(这种情况很少见)并且密码不是随机的(如果有人注意使用这么长的密码,这种情况不太可能发生) ).很多如果。
还有陷阱:
- 如果您使用 SHA-512 的二进制输出,那么您可能会偶然发现
[=10=]
个字符,这会导致不安全的散列,请参阅此 article。 - 如果您使用 SHA 的 hex/base64 表示,您将限制 72 个位置的可能字符。