2010-08-09 28 views
10

Tôi sử dụng jdbcRealm để bảo mật trong glassfish v3.0.1 b22 của mình. Nó được thiết lập để nó sử dụng bảng USER bên trong cơ sở dữ liệu của tôi để xác thực bằng cách theo dõi blog này: http://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication. Tôi nhận được nó làm việc tốt, nếu tôi để lại thuật toán tiêu hóa như văn bản thuần túy. Tuy nhiên khi tôi cố gắng sử dụng SHA-256 cho thuật toán tiêu hóa, nó ngừng hoạt động. Những gì tôi đã làm là xác định trong Glassfish - Security - Realm - jdbcRealm - tiêu hóa mà tôi muốn SHA-256 (tôi chỉ cần gõ SHA-256 bên trong lĩnh vực tiêu hóa). Sau đó, tôi đã viết một chương trình Java đơn giản để chuyển đổi văn bản mật khẩu thành mã băm SHA-256. Sau đó tôi dán mã băm đó vào trường mật khẩu của tôi trong cơ sở dữ liệu. Bằng cách này, trường mật khẩu là loại varchar (30). Tôi không thể đăng nhập được nữa. Một điều tôi nhận thấy rằng chương trình Java đơn giản của tôi tạo ra băm khác nhau mỗi lần cho cùng một trường văn bản.Glassfish Security - jdbcRealm: Cách cấu hình đăng nhập với tiêu hóa SHA-256

Dưới đây là chương trình java đơn giản của tôi:

 MessageDigest md = MessageDigest.getInstance("SHA-256"); 
     String text = "admin"; 
     md.update(text.getBytes("UTF-8")); 
     byte[] digest = md.digest(); 
     System.out.println(digest.toString()); 
+0

Tôi gặp sự cố khi di chuyển từ 4.0 đến 4.1.1 http://stackoverflow.com/questions/40686737/migration-from-glassfish-4-0-to-glassfish-4-1-1-jdbc-realm phát hành – Bikram

Trả lời

16

Các jdbcRealm cho phép các giá trị mã hóa hex hoặc base64. Bạn cần phải xác định một trong những trong cấu hình vương quốc của bạn và trong mã của bạn, chuyển đổi các mảng byte thành một trong những định dạng:

Base64:

import com.sun.org.apache.xml.internal.security.utils.Base64; 
... 
byte[] digest = md.digest(); 
System.out.println(Base64.encode(digest)); 

Hex:

... 
byte[] digest = md.digest(); 
StringBuffer sb = new StringBuffer(); 
for (int i = 0; i < digest.length; i++) { 
    String hex = Integer.toHexString(0xff & digest[i]); 
    if (hex.length() == 1) sb.append('0'); 
    sb.append(hex); 
} 
System.out.println(sb.toString()); 

btw, trường mật khẩu là loại varchar (30)

Bạn cần tăng kích thước của trường mật khẩu của mình. Các giá trị SHA-256 base64 và hex tương ứng là 45 và 64 ký tự.

+0

Siêu !!! Bạn là một người tiết kiệm cuộc sống. Tôi đã nhìn vào điều này trong một thời gian. Cảm ơn nhiều. Sucks rằng tôi chỉ có thể cung cấp cho bạn 1 phiếu bầu. –

+0

Tôi gặp vấn đề với việc di chuyển từ 4.0 đến 4.1.1 http://stackoverflow.com/questions/40686737/migration-from-glassfish-4-0-to-glassfish-4-1-1-jdbc-realm-issue – Bikram

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