25

我正在尝试在我的 Play 2.1 中使用 BCrypt 实现身份验证。Java 应用程序,但是Invalid salt version exception当我尝试对用户进行身份验证时,我得到了。

这是我的堆栈跟踪

play.api.Application$$anon$1: Execution exception[[IllegalArgumentException: Invalid salt version]]
at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.jar:2.1.0]
at play.api.DefaultApplication.handleError(Application.scala:383) [play_2.10.jar:2.1.0]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:132) [play_2.10.jar:2.1.0]
at play.core.server.netty.PlayDefaultUpstreamHandler$$anon$2$$anonfun$handle$1.apply(PlayDefaultUpstreamHandler.scala:128) [play_2.10.jar:2.1.0]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.0]
at play.api.libs.concurrent.PlayPromise$$anonfun$extend1$1.apply(Promise.scala:113) [play_2.10.jar:2.1.0]
java.lang.IllegalArgumentException: Invalid salt version
at org.mindrot.jbcrypt.BCrypt.hashpw(BCrypt.java:664) ~[jbcrypt-0.3m.jar:na]
at org.mindrot.jbcrypt.BCrypt.checkpw(BCrypt.java:763) ~[jbcrypt-0.3m.jar:na]
at model.operations.DistrictOperations.authenticate(DistrictOperations.java:24) ~[na:na]
at controllers.Application.authenticateDistrict(Application.java:26) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(routes_routing.scala:133) ~[na:na]
at Routes$$anonfun$routes$1$$anonfun$applyOrElse$2$$anonfun$apply$2.apply(routes_routing.scala:133) ~[na:na]

我正在使用以下 Maven 存储库: http: //mvnrepository.com/artifact/org.mindrot/jbcrypt/0.3m

我的代码基于文档,因此

district.setPassword(BCrypt.hashpw(json.findPath("password").getTextValue(), BCrypt.gensalt()));    

用于保存密码(我也在检查密码是否为空)

BCrypt.checkpw(password, d.getPassword());

用于检查输入的密码是否正确,其中密码为字符串,d.getPassword() 为散列密码。

我不知道这是否是相关信息,但确切地说,我将休眠用于 ORM 和 PostgreSQL 8.4 作为数据库。

我有点卡在这里所以我问是否有人可以帮助我。比你提前很多。

4

9 回答 9

16

对于遇到相同异常的其他人,请检查您的BCrypt.checkpw参数是否正确。(我没有,因此在我意识到我的愚蠢错误之前发现了这个问题。)

或者正如 OP 自己回答的那样,记录/调试散列密码的值以仔细检查您实际上是在比较散列密码!它应该是格式为 60 字符的字符串 $2a$10$llw0G6IyibUob8h5XRt9xuRczaGdCm/AiV6SSjf5v78XS824EGbh.

于 2013-05-28T21:38:40.963 回答
16

我很抱歉打扰这个问题。我在将纯字符串保存到数据库而不是 BCrypted 的代码中只有一个错误。它是从代码的其他部分整体调用的。

于 2013-05-10T09:41:18.443 回答
4

我遇到了同样的问题;确保您的密码以散列格式而不是纯文本存储在数据库中。这是一个Bcrypt 生成器,用于将您的纯文本密码转换为 Bcrypt 哈希。

于 2015-10-19T08:10:59.887 回答
2

您必须确保第一个参数是明文,第二个参数是散列密码。这是函数的声明:

 public static boolean checkpw(String plaintext, String hashed)
于 2018-05-29T08:15:46.323 回答
2

jBcrypt 太老了,实际上没有维护。请考虑切换到该库的新实现来处理新$2y$版本。

我使用这个纯 Java 库https://github.com/patrickfav/bcrypt解决了这个问题,并将其添加到我当前的 Scala 项目中。

使用以下函数,我终于可以验证使用创建的哈希VERSION_2Y

  /**
    * Verifies an encrypted password against the expected value
    *
    * @link https://github.com/patrickfav/bcrypt
    * @param hash The hashed password (encypted with BCrypt version $2Y$)
    * @param password The unencrypted password string
    */
  private def verifyBcryptHash(hash: String, password: String): Boolean = {
    if (hash == null || hash.trim.isEmpty)
      false
    else
      BCrypt
        .verifyer()
        .verifyStrict(
          password.toCharArray(),
          hash.toCharArray(),
          BCrypt.Version.VERSION_2Y
        )
        .verified
  }
于 2019-06-04T17:14:56.143 回答
1

checkpw(password, hash)如果您传入的“哈希”值甚至不是可破译的值,BCrypt 似乎会抛出这个红鲱鱼

于 2019-05-17T06:13:00.350 回答
1

在我的情况下,我{bcrypt}在插入 db 期间用作前缀。

实例

{bcrypt}$2a$12$Yb3YagKV8B3AXoY2p/Ldk.L2maVKfNlr2dedk4ZUs/YUlalS8EzYu

prefix当我检索密码时,将返回整个值,包括。hashing所以我已经从值中排除了前缀。

String prefix= "{bcrypt}";

String hash_pw= user.getPassword().substring((prefix.length());

BCrypt.checkpw(loginRequest.getPassword(),hash_pw);
于 2020-11-30T07:19:01.730 回答
0

就我而言,由于将来自https://bcrypt-generator.com的散列密码应用到我的服务器的 bcrypt 检查器(spring java security)中,我得到了这个盐修订错误。但是,使用另一个相同的普通密码但从https://www.javainuse.com/onlineBcrypt散列,它可以工作并验证密码。对数轮的配置相同 (16)。

我认为我的情况是因为使用了不同的 bcrypt 编码器,尽管有些可能使用不同的编码器。

但是,如果 bcrypt 生成器和检查器来自同一个库,则可以确保散列密码不存在此问题。

于 2021-07-12T05:55:22.940 回答
0

您可以拆分{bcrypt},并尝试使用其他详细信息

BCrypt.checkpw("123", "$2a$10$lVPvO6zyyxEWEPlKBg5B3OTjUHGS4LZ2jlulWAUpOjGz3.helz9H2");
于 2021-03-22T05:40:15.137 回答