2013-05-10 47 views
10

Tôi đang cố triển khai xác thực bằng cách sử dụng BCrypt, trong Play 2.1 của tôi. Ứng dụng Java, nhưng tôi đang nhận được Invalid salt version exception khi tôi đang cố gắng xác thực người dùng.BCrypt.checkpw() Ngoại lệ phiên bản muối không hợp lệ

Đây là stack trace tôi

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] 

Tôi đang sử dụng kho maven sau: http://mvnrepository.com/artifact/org.mindrot/jbcrypt/0.3m

Mã của tôi được dựa trên các tài liệu, do đó

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

Đối với lưu mật khẩu (Tôi cũng đang kiểm tra mật khẩu bị vô hiệu)

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

Để kiểm tra xem mật khẩu đã nhập có chính xác không, mật khẩu là String và d.getPassword() là mật khẩu được băm.

Tôi không biết đây có phải là thông tin liên quan hay không, nhưng chính xác là tôi đang sử dụng hibernate cho ORM và PostgreSQL 8.4 làm DB.

Tôi bị kẹt ở đây vì vậy tôi hỏi liệu có ai có thể giúp tôi không. Hơn bạn rất nhiều trước.

Trả lời

7

Tôi rất tiếc vì đã làm phiền với câu hỏi này. Tôi đã có chỉ là một lỗi trong mã đã được lưu chuỗi đồng bằng để DB thay vì một trong những BCrypted. Nó được gọi là từ một số phần khác của mã.

13

Đối với những người khác gặp phải ngoại lệ tương tự, hãy kiểm tra xem bạn có thông số BCrypt.checkpw đúng vòng hay không. (Tôi đã không và do đó tìm thấy câu hỏi này trước khi tôi nhận ra sai lầm ngớ ngẩn của mình.)

Hoặc khi OP tự trả lời, hãy log/gỡ lỗi giá trị của mật khẩu băm để kiểm tra lại bạn đang thực sự so sánh mật khẩu băm! Mã phải là chuỗi 60 ký tự ở định dạng $2a$10$llw0G6IyibUob8h5XRt9xuRczaGdCm/AiV6SSjf5v78XS824EGbh.

+3

Cụ thể: muối JBCrypt dự kiến ​​muối phiên bản 2a, do đó muối bắt đầu với $ 2a $. Nếu bạn đã sử dụng phiên bản BCrypt khác sử dụng phiên bản muối hiện đại hơn 2y hoặc 2b - JBCrypt sẽ ném một ngoại lệ. – daphshez

3

Tôi gặp phải vấn đề tương tự; Đảm bảo mật khẩu của bạn được lưu trữ trong cơ sở dữ liệu ở định dạng băm thay vì văn bản thuần túy. Đây là một Bcrypt generator để dịch mật khẩu văn bản thuần túy của bạn thành một băm Bcrypt.

Các vấn đề liên quan