Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BCrypt.checkpw()无效的salt版本异常_Java_Hibernate_Playframework 2.1_Bcrypt_Jbcrypt - Fatal编程技术网

Java BCrypt.checkpw()无效的salt版本异常

Java BCrypt.checkpw()无效的salt版本异常,java,hibernate,playframework-2.1,bcrypt,jbcrypt,Java,Hibernate,Playframework 2.1,Bcrypt,Jbcrypt,在我的剧本2.1中,我尝试使用BCrypt实现身份验证。Java应用程序,但我在尝试验证用户身份时遇到无效的salt版本异常 这是我的堆栈跟踪 play.api.Application$$anon$1: Execution exception[[IllegalArgumentException: Invalid salt version]] at play.api.Application$class.handleError(Application.scala:289) ~[play_2.10.j

在我的剧本2.1中,我尝试使用BCrypt实现身份验证。Java应用程序,但我在尝试验证用户身份时遇到
无效的salt版本异常

这是我的堆栈跟踪

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存储库:

我的代码基于文档,因此

district.setPassword(BCrypt.hashpw(json.findPath("password").getTextValue(), BCrypt.gensalt()));    
用于保存密码(我还检查密码是否为空)

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

我不知道这是否是相关信息,但准确地说,我正在使用hibernate for ORM和PostgreSQL 8.4作为DB


我被困在这里了,所以我想问是否有人能帮我。比你提前了很多时间。

我很抱歉打扰你这个问题。我的代码中只有一个bug,它将普通字符串保存到数据库中,而不是BCrypted字符串。它是从代码的其他部分调用的。

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

或者,正如OP自己回答的那样,记录/调试散列密码的值,以再次检查您是否正在比较散列密码!格式应为60个字符的字符串
$2a$10$LLW0G6IYIBOUB8H5XRT9XURCZAGDCM/AiV6SSjf5v78XS824EGbh。
我遇到了同样的问题;确保您的密码以哈希格式而不是纯文本存储在数据库中。下面是一个将纯文本密码转换为Bcrypt哈希的方法。

您必须确保第一个参数是纯文本,第二个参数是哈希密码。 这是函数的声明:

 public static boolean checkpw(String plaintext, String hashed)

如果您传递给
checkpw(password,hash)
的“hash”值甚至不是一个可解码的值,那么BCrypt似乎是在转移注意力。请考虑切换到该库的新实现,以处理新的<代码> $2y$版本。

我使用这个纯Java库解决了这个问题,并将它添加到我当前的Scala项目中

使用以下函数,我最终可以验证使用
VERSION\u 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
  }

在我的例子中,我在插入db的过程中使用了
{bcrypt}
作为前缀

实例

{bcrypt}$2a$12$Yb3YagKV8B3AXoY2p/Ldk.L2maVKfNlr2dedk4ZUs/YUlalS8EzYu
当我检索密码时,将返回整个值,包括
前缀
。因此,我已将前缀从
哈希值中排除

String prefix= "{bcrypt}";

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

BCrypt.checkpw(loginRequest.getPassword(),hash_pw);

您能否拆分
{bcrypt}
,然后使用

BCrypt.checkpw("123", "$2a$10$lVPvO6zyyxEWEPlKBg5B3OTjUHGS4LZ2jlulWAUpOjGz3.helz9H2");

特别是:salt JBCrypt需要salt版本2a,因此salt以$2a$开始。如果您使用的是另一个使用更现代的salt版本2y或2b的BCrypt版本,则-JBCrypt会引发异常。我发现User.withDefaultPasswordEncoder被标记为已弃用,并且它完全是输出(如调试器所示):{BCrypt}$2a$10$dXJ3SW6G7P50lGmMkkmwe.20cQQubK3.HZWzG3YB1tlRy.fqvM/BGuse
PasswordEncoderFactorys.createDelegatingPasswordEncoder()
用于密码编码,并将编码类型作为前缀。如果不使用编码机制,请将
{noop}
作为前缀。PasswordEncoderFactory使用“prefix”标识您的哈希类型。我遇到了类似的问题。我在做
bcrypt.checkpw(hashpass,plainpass)
而不是相反的方法。感觉真的很愚蠢。我希望这条评论能让人们再次确认。欢迎来到StackOverflow。请注意以正确的格式发布您的答案。请参阅:
BCrypt.checkpw("123", "$2a$10$lVPvO6zyyxEWEPlKBg5B3OTjUHGS4LZ2jlulWAUpOjGz3.helz9H2");