我打算在新的Web应用程序中使用jBCrypt进行密码散列,因为它应该是我读过的最好的.因为我在调查之前没有使用它,是否有任何理由不使用它.
我有这个:
我正在尝试使用BCrypt在我的Play 2.1中实现身份验证.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]
Run Code Online (Sandbox Code Playgroud)
我正在使用以下maven存储库:http://mvnrepository.com/artifact/org.mindrot/jbcrypt/0.3m
因此,我的代码基于文档
district.setPassword(BCrypt.hashpw(json.findPath("password").getTextValue(), BCrypt.gensalt()));
Run Code Online (Sandbox Code Playgroud)
用于保存密码(我还检查密码为空)
BCrypt.checkpw(password, d.getPassword());
Run Code Online (Sandbox Code Playgroud)
检查输入的密码是否正确,其中password是String,d.getPassword()是哈希密码.
我不知道这是否是相关信息,但准确地说,我正在使用hibernate for ORM和PostgreSQL 8.4作为DB.
我有点被困在这里,所以我问是否有人可以帮助我.比你提前多了.
我正在Spring Hibernate MVC中处理Web应用程序项目.我在Spring安全性中使用Bcrypt算法将编码密码存储在数据库中.现在我想要解码该编码密码以停用使用帐户我在给用户电子邮件和密码的位置,以便在用户停用帐户之前进行验证.我在获取解码密码时遇到问题.任何人都可以帮助我摆脱它或任何替代解决方案满足我的要求吗?
我无法使用BCrypt的checkpw(plaintextpw,previoushash)方法获取明文密码和之前的哈希值.
在寄存器servlet中,我获取输入的密码,使用BCrypt的hashpw(密码,genSalt)方法对其进行散列并将其存储在db中.
在登录servlet中,我从db中获取该哈希值,并使用BCrypt的checkpw来查看它是否与输入的密码匹配.
它从不匹配.这在我的常规Java应用程序中工作正常,而不是在webapp中.没有其他人有这个问题所以我认为我一定是做错了:
//RegisterServlet
String pw_hash = BCrypt.hashpw(request.getParameter("password"), BCrypt.gensalt());
String loginInsertString = "insert into login (loname,lopassword,locustomerid)" +
" VALUES ('" + username + "','" + pw_hash + "','" + loginInsert + "');";
//LoginServlet
ResultSet rs = stmt.executeQuery("select lopassword from login where loname = '" +
loginName + "';");
while( rs.next()){
dbhash = rs.getString(1);
}
out.println(dbhash+"<br>");
if (BCrypt.checkpw(request.getParameter("password"), dbhash)) {
out.println("It matches");
}else{
out.println("It does not match");
}
Run Code Online (Sandbox Code Playgroud)
BCrypt API非常简单 - 这里
我不存储盐,因为BCrypt你认为不需要 - 所以我做错了什么?
我在使用我的应用程序注册时使用jBCrypt库来哈希用户密码.
我正在使用基本哈希函数,使用salt,如下所示:
String pass = BCrypt.hashpw(rawPass, BCrypt.gensalt());
Run Code Online (Sandbox Code Playgroud)
我注意到在注册时挂了一到两分钟,并检查了调试器,确认BCrypt负责.
盐化密码真的需要那么多的处理能力吗?如果是这样,一个好的选择是将明文密码发送到服务器来散列它吗?我最初的想法就是在它发送到任何地方之前将其哈希.有任何想法吗?
我正在使用jbcrypt来哈希项目中的密码.验证我正在使用的硬件上的密码时性能大约为500毫秒(log_rounds设置为12).然而,经过一段时间的常规使用后,表演时间突然下降到惊人的15秒.下降非常突然,没有累积,并且在重新启动过程之前保持不变.
分析显示在密钥(..)方法中使用了额外的时间.
来源:http://jbcrypt.googlecode.com/svn/tags/jbcrypt-0.3m/src/main/java/org/mindrot/jbcrypt/BCrypt.java
此方法仅使用xor,shift等基本函数计算哈希值.没有对象分配,外部资源的使用,随机数生成等.
在同一进程中,性能不会因其他功能而下降.内存分配稳定且低.不涉及完整的GC.
有没有人见过这个或为什么会发生这种情况的任何线索?我可以理解一种可变性能在某种程度上取决于其他情况,但这是一个非常突然和稳定的下降,从大约500ms.到大约15000毫秒.
在我们的Web应用程序中,我们使用jBcrypt进行散列密码.在对密码进行散列时,我们使用13个log_rounds.
通常,BCrypt.checkpw()大约需要1秒钟.但是不时(几天之后),它突然开始变慢,从那个时间开始需要将近30秒并且没有恢复到正常速度.重新启动Tomcat是唯一有用的东西.
我不会怀疑这是否会不时发生,例如,如果CPU负载很高或GC正在运行.但情况并非如此,它只是突然开始变慢.只有登录过程受到影响,应用程序的其余部分仍然很快.我们也没有任何可确定的内存泄漏或其他性能问题.只是BCrypt.checkpw()很慢.线程转储显示BCrypt.checkpw和后续方法调用消耗的时间,尤其是BCrypt.encipher:
Thread 8597: (state = IN_JAVA)
- org.mindrot.jbcrypt.BCrypt.encipher(int[], int) @bci=0, line=490 (Interpreted frame)
- org.mindrot.jbcrypt.BCrypt.key(byte[]) @bci=122, line=562 (Interpreted frame)
- org.mindrot.jbcrypt.BCrypt.crypt_raw(byte[], byte[], int) @bci=89, line=629 (Compiled frame)
- org.mindrot.jbcrypt.BCrypt.hashpw(java.lang.String, java.lang.String) @bci=226, line=692 (Interpreted frame)
- org.mindrot.jbcrypt.BCrypt.checkpw(java.lang.String, java.lang.String) @bci=3, line=763 (Interpreted frame)
Run Code Online (Sandbox Code Playgroud)
我在SO上只发现了一个类似的问题,但在我们的例子中,多个类加载器不是问题: 使用jbcrypt时可变性能和降级性能
有谁知道这里发生了什么?
Apache Shiro身份验证框架是否支持使用bCrypt密码哈希算法?如果没有,是否有办法使其与Shiro一起使用?
除了Spring Security之外,还有Shiro支持bCrypt的其他身份验证框架吗?
我使用 Gradle 6.9,这是我的 build.gradle 文件:
plugins {
id "groovy"
id "java"
}
group "com.matthiasdenu"
version "1.0-SNAPSHOT"
repositories {
mavenCentral()
maven {
url 'https://repo.jenkins-ci.org/releases/'
}
}
ext {
jobDslVersion = "1.77"
jenkinsVersion = "2.252"
}
sourceSets {
jobs {
groovy {
srcDirs "jobs"
compileClasspath += main.compileClasspath
}
compileClasspath += sourceSets.main.output
runtimeClasspath += sourceSets.main.output
}
}
dependencies {
compile("org.jenkins-ci.main:jenkins-war:${jenkinsVersion}"){
// https://github.com/sheehan/job-dsl-gradle-example/issues/87
exclude group: "org.jenkins-ci.ui", module: "bootstrap"
}
}
test {
useJUnitPlatform()
}
Run Code Online (Sandbox Code Playgroud)
这是我收到的错误消息:
Execution failed for task ':compileTestGroovy'.
> Could not resolve …Run Code Online (Sandbox Code Playgroud) 这个问题已在Stack Overflow问题中得到解答,但它并不是Grails特有的,也有点模糊.
我使用Spring Security设置我的Grails应用程序,但显然没有获得最新版本,因为它默认为SHA-256而不是bcrypt.现在我的生产数据带有密码哈希,这似乎是一种不太理想的方法.
启用 bcrypt哈希是一块蛋糕:
Config.groovy > grails.plugins.springsecurity.password.algorithm = 'bcrypt'
Run Code Online (Sandbox Code Playgroud)
但现在我需要应用程序将旧哈希转换为新哈希.从根本上说,我了解当用户登录时,我应该让应用程序检查密码是否为SHA-256哈希值,如果是,则使用bcrypt重新哈希输入的密码.过了一会儿,他们都会升级,代码可以删除.
但是,确定密码哈希值是来自SHA-256还是bcrypt的实际代码是什么?
编辑
也就是说,我调用哈希的实际函数是什么?如何bcrypt(incomingpassword)查看它是否与现有密码哈希匹配?