【问题标题】:jBCrypt serious issue with checkpw (return true when it shouldn't?)jBCrypt checkpw 的严重问题(不应该返回true?)
【发布时间】:2011-09-04 23:49:39
【问题描述】:

编辑:好的,所以我在这里找到了答案BCrypt says long, similar passwords are equivalent - problem with me, the gem, or the field of cryptography?

不过,新问题是,如果在我们试图教育用户选择越来越复杂的密码甚至密码短语的世界中,如果您必须限制用户的密码长度,那么有人如何推荐使用 bCrypt 进行散列,说您的密码必须更短在 thedailywtf.com 星期五的屏幕截图中,似乎有超过 n 个字符的方式结束 :)

原始问题如下:

我正在重构一个应用程序的旧登录页面,并决定使用 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");

}

}

这将打印“它匹配”。

我遇到的问题是说您将说 aaa 添加到您传递给 checkpw 的密码中

BCrypt.checkpw("jw~ct/f61y1m7q458GiLVQpiqDK|8kG=d368Id:D@$^_80I{qrn1HM6423{FtestAccountO1nu3jKNaaa", pw_hash)

它仍然返回 true!不完全是我所期待的。我在文档中看不到任何密码长度限制,但我无法用较小的密码种子重现它,而且看起来如果我修改了字符串末尾以外的任何其他内容,它会按预期返回 false。

我错过了什么重要的事情吗?我知道我一定不是唯一在这些论坛上使用 jBcrypt 的人,因为我在做一些研究时看到许多帖子中推荐 BCrypt。

编辑:Windows 7 64 位 - Java(TM) SE 运行时环境(内部版本 1.6.0_24-b07)

【问题讨论】:

    标签: security encryption passwords salt blowfish


    【解决方案1】:

    实际上,您自己的答案是很棒,并帮助我找到了烦人的问题;)对于在散列之前添加某种应用程序的秘密的人有一些提示(即使他们限制了密码长度):在 end 中包含应用程序密码,特别是如果应用程序的密码长度为 72 个字符 - 否则每次点击都会返回 true

    所以改为:

    String hashed = BCrypt.hashpw(APP_SECRET + plain, BCrypt.gensalt())

    使用:

    String hashed = BCrypt.hashpw(plain + APP_SECRET, BCrypt.gensalt())

    即使发生 Bcrypt 的裁剪,checkpw 的结果也是有效的!

    【讨论】:

      【解决方案2】:

      好的,所以这个问题的措辞足以让我真正弄清楚我在寻找什么(为rubber ducking 欢呼)。密码学领域现在是安全的!

      BCrypt 使用 P_orig 实现 XOR,它是 18 个 4 字节整数,直到它到达末尾,这将您的加密“密钥”限制为 72 个字节。 72 字节之后的所有内容都将被忽略(警告会很好)。

      似乎被接受的妥协不是将用户的密码限制为 72 个字符或更少,而只是让它静默通过。这背后的想法是 72 个字符的 bCrypted 密码无论如何都比快速散列替代方案更好。

      来源:BCrypt says long, similar passwords are equivalent - problem with me, the gem, or the field of cryptography?

      【讨论】:

        猜你喜欢
        • 2018-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-24
        相关资源
        最近更新 更多