Java BCrypt.checkpw()无效的salt版本异常
在我的剧本2.1中,我尝试使用BCrypt实现身份验证。Java应用程序,但我在尝试验证用户身份时遇到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
无效的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/BGusePasswordEncoderFactorys.createDelegatingPasswordEncoder()
用于密码编码,并将编码类型作为前缀。如果不使用编码机制,请将{noop}
作为前缀。PasswordEncoderFactory使用“prefix”标识您的哈希类型。我遇到了类似的问题。我在做bcrypt.checkpw(hashpass,plainpass)
而不是相反的方法。感觉真的很愚蠢。我希望这条评论能让人们再次确认。欢迎来到StackOverflow。请注意以正确的格式发布您的答案。请参阅:
BCrypt.checkpw("123", "$2a$10$lVPvO6zyyxEWEPlKBg5B3OTjUHGS4LZ2jlulWAUpOjGz3.helz9H2");