2009-11-30 70 views
15

Tôi có một ứng dụng web java sử dụng khung công tác mùa xuân và bảo mật mùa xuân để đăng nhập. Trong cơ sở dữ liệu của tôi, tôi đã mã hóa mật khẩu của mình thành MD5 trước khi được lưu. Tôi đã thêm vào ứng dụng của tôi-config.xml mã nàyMã hóa bảo mật mùa xuân MD5

<security:authentication-provider> 
<security:password-encoder hash="md5"/> 
<security:jdbc-user-service 
     data-source-ref="dataSource" 
     users-by-username-query="select user_name username, user_password password, 1 enabled from users where user_name=?" 
     authorities-by-username-query="select username, authority from authorities where username=?" /> 
</security:authentication-provider> 

Lúc đầu, nó hoạt động khi mật khẩu trong db không được mã hóa. Nhưng khi tôi mã hóa và thêm đoạn mã này vào cấu hình ứng dụng của tôi

 <security:password-encoder hash="md5"/> 

Tôi không thể đăng nhập.

+7

md5 là hàm băm, không phải là phương pháp mã hóa. – u0b34a0f6ae

+1

ý của bạn là gì. Tôi nên làm gì – cedric

Trả lời

6

Bạn đang tạo băm MD5 của mình như thế nào? Một cái gì đó giống như các công việc sau tốt trong Java:

MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 
messageDigest.update(user.getPassword().getBytes(),0, user.getPassword().length()); 
String hashedPass = new BigInteger(1,messageDigest.digest()).toString(16); 
if (hashedPass.length() < 32) { 
    hashedPass = "0" + hashedPass; 
} 

Khi bạn mã hóa "Koala" để bạn có được "a564de63c2d0da68cf47586ee05984d7"?

+0

ah ok .. tôi đã bỏ lỡ 16 trong messageDigest.digest()). ToString (16). cảm ơn – cedric

+0

thực sự, có thể có ít hơn 31 ký hiệu. vì thế. điều này sẽ không hoạt động trong một số trường hợp (rất hiếm). bạn phải thêm "0" miễn là bạn không có 32 ký hiệu –

4

Bạn đã đọc 6.3.3 Hashing and Authentication phần từ hướng dẫn tham khảo Spring Security chưa? Nó đã đề cập đến một số vấn đề có thể xảy ra mà bạn có thể gặp phải khi sử dụng băm mật khẩu.

Một số khả năng nó được liệt kê:

  • Cơ sở dữ liệu mật khẩu băm có thể là trong Base64, trong khi kết quả từ MD5PasswordEncoder là trong chuỗi thập lục phân
  • băm mật khẩu của bạn có thể ở chữ hoa, trong khi kết quả từ bộ mã hóa nằm trong chuỗi chữ thường
47

Tôi nhận ra điều này hơi trễ một chút, nhưng Spring đã tích hợp sẵn các lớp giúp việc này trở nên dễ dàng hơn rất nhiều.

@Test 
public void testSpringEncoder() { 
    PasswordEncoder encoder = new Md5PasswordEncoder(); 
    String hashedPass = encoder.encodePassword("koala", null); 

    assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass); 
} 

Đây là một thử nghiệm đơn vị mà tôi đã viết bằng cách sử dụng được xây dựng trong mã Xuân An, nó là nhỏ hơn rất nhiều so với các mã MessageDigest và kể từ khi bạn đang sử dụng Xuân An đã có, bạn nên có các lớp trong classpath của bạn đã .

+2

Đây là câu trả lời hay nhất. Sạch sẽ và dễ dàng với mùa xuân. –

+1

Đây là [câu trả lời khác] (http://stackoverflow.com/questions/7378107/hashing-and-salting-passwords-with-spring-security-3) với một chút chi tiết hơn về cách sử dụng nó gọn gàng trong ứng dụng Spring của bạn . – chrisjleu

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