2010-08-09 42 views
10

我在我的glassfish v3.0.1 b22中使用jdbcRealm來實現安全性。它的設置是爲了使用我的數據庫中的USER表進行身份驗證,方法如下:http://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication。如果我將摘要算法作爲純文本保留,我就能正常工作。但是,當我嘗試使用SHA-256摘要算法時,它停止工作。 我所做的是在Glassfish - Security - Realm - jdbcRealm中指定 - 我想要SHA-256(我只是在摘要字段中鍵入SHA-256)。然後我編寫了一個簡單的Java程序來將密碼文本轉換爲SHA-256哈希。然後將該散列粘貼到數據庫中的密碼字段中。順便說一句,密碼字段是類型varchar(30)。我不能再登錄了。有一件事我注意到,我的簡單Java程序每次都爲同一文本字段生成不同的哈希值。Glassfish安全 - jdbcRealm:如何配置用SHA-256摘要登錄

下面是我簡單的Java程序:

 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

我遇到從4.0遷移到4.1.1的問題http://stackoverflow.com/questions/40686737/migration-from-glassfish-4-0-to-glassfish-4-1-1-jdbc-realm -issue – Bikram 2016-11-27 01:36:52

回答

16

的jdbcRealm允許十六進制或Base64編碼值。你需要指定其中一個在你的領域配置,並在你的代碼,將字節數組轉換爲這些格式之一:

Base64編碼:

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

十六進制:

... 
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,密碼字段是type varchar(30)

您需要增加密碼字段的大小。 SHA-256 base64和hex值分別爲45和64個字符。

+0

超級!你是一個拯救生命的人。我一直在研究這個事情很長一段時間。非常感謝你。吮吸,我只能給你1投票。 – 2010-08-10 18:47:27

+0

我遇到了從4.0到4.1.1的遷移問題http://stackoverflow.com/questions/40686737/migration-from-glassfish-4-0-to-glassfish-4-1-1-jdbc-realm-issue – Bikram 2016-11-27 01:37:04