编辑:好的,所以我在这里找到了一个答案BCrypt 说很长,类似的密码是等效的 - 我的问题,宝石或密码学领域?
不过,新问题是,如果在我们试图教育用户选择越来越复杂的密码甚至密码短语的世界中,如果您必须限制用户的密码长度,那么有人如何推荐使用 bCrypt 进行散列,说您的密码必须短于 n 个字符似乎是在 thedailywtf.com 周五的截图中结束的一种方式:)
下面的原始问题:
我正在为一个应用程序重构一个旧的登录页面,并决定使用 JAVA 实现 jBCrypt ( http://www.mindrot.org/projects/jBCrypt/ ) 给 bCrypt 一个旋转,并遇到了一个主要的显示停止器。
问题在于checkpw方法,当使用很长的种子时,它似乎总是返回 true。我打算用 {InternalSalt}{username}{password} 对用户的密码加盐,然后用 bCrypt 对其进行哈希处理。
所以我有以下代码(尽可能将其剥离以隔离checkpw)。
public class Test {
public static void main(String[] args) {
String plaintext = "jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKN";
String pw_hash = BCrypt.hashpw(plaintext, BCrypt.gensalt());
if (BCrypt.checkpw("jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKN", pw_hash))
System.out.println("It matches");
else
System.out.println("It does not match");
}
}
这将打印“它匹配”。
我遇到的问题是说您将say aaa添加到您传递给checkpw 的密码中
BCrypt.checkpw("jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKNaaa", pw_hash)
它仍然返回真实!不完全是我所期待的。我在文档中看不到任何密码长度限制,但我无法用较小的密码种子重现它,而且看起来如果我修改了字符串末尾以外的任何其他内容,它会按预期返回 false。
我错过了什么重要的事情吗?我知道我一定不是唯一在这些论坛上使用 jBcrypt 的人,因为我在做一些研究时看到许多帖子中推荐了 BCrypt。
编辑:Windows 7 64 位 - Java(TM) SE 运行时环境(构建 1.6.0_24-b07)