2013-05-10 20 views
10

Ich versuche, die Authentifizierung mit BCrypt in meinem Play 2.1 zu implementieren. Java-Anwendung, aber ich bekomme Invalid salt version exception, wenn ich versuche, den Benutzer zu authentifizieren.BCrypt.checkpw() Ungültige Salz Version Ausnahme

Das ist mein Stack-Trace

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] 

Ich folge Maven-Repository mit: wird http://mvnrepository.com/artifact/org.mindrot/jbcrypt/0.3m

Mein Code auf der Dokumentation basiert, so

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

Für das Passwort speichern (Ich überprüfe auch das Passwort, um Null zu sein)

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

Zur Überprüfung, ob das eingegebene Passwort korrekt ist, wobei das Passwort String ist und d.getPassword() ein Hash-Passwort hat.

Ich weiß nicht, ob dies relevante Informationen sind, aber um genau zu sein verwende ich Hibernate für ORM und PostgreSQL 8.4 als DB.

Ich bin irgendwie hier drin stecken, also frage ich, ob mir jemand helfen könnte. Als Sie sehr im Voraus.

Antwort

7

Es tut mir leid, dass ich mich mit dieser Frage beschäftigt habe. Ich hatte nur einen Fehler im Code, der eine einfache Zeichenfolge in der DB statt der BCrypted speicherte. Es wurde ganz aus einem anderen Teil des Codes aufgerufen.

13

Für andere, die auf die gleiche Ausnahme stoßen, überprüfen Sie, ob Sie die BCrypt.checkpw Parameter richtig herum haben. (Ich habe diese Frage nicht gefunden, und deshalb habe ich meinen dummen Fehler bemerkt.)

Oder wie das OP selbst antwortet, den Wert des Hash-Passworts protokollieren/debuggen, um zu überprüfen, ob Sie tatsächlich ein Hash-Passwort vergleichen! Es sollte eine 60-Zeichenkette im Format sein $2a$10$llw0G6IyibUob8h5XRt9xuRczaGdCm/AiV6SSjf5v78XS824EGbh.

+3

Insbesondere: das Salz JBCrypt erwartet Salz Version 2a, also ein Salz beginnend mit $ 2a $. Wenn Sie eine andere BCrypt-Version verwenden, die eine modernere Salzversion 2y oder 2b verwendet - JBCrypt löst eine Ausnahme aus. – daphshez

3

Ich stieß auf das gleiche Problem; Stellen Sie sicher, dass Ihr Kennwort in der Datenbank in Hash-Format statt in Nur-Text gespeichert wird. Hier ist ein , um Ihr Klartext-Passwort in einen BCrypt-Hash zu übersetzen.

Verwandte Themen