2010-08-09 19 views
10

Ich benutze jdbcRealm für Sicherheit in meinem Glassfish v3.0.1 b22. Es ist so eingerichtet, dass es die USER-Tabelle in meiner Datenbank für die Authentifizierung verwendet, indem Sie diesem Blog folgen: http://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication. Ich habe es funktioniert gut, wenn ich den Digest-Algorithmus als Klartext verlassen. Wenn ich jedoch versuche, SHA-256 für Digest-Algorithmus zu verwenden, hört es auf zu arbeiten. Was ich getan habe ist in Glassfish angeben - Security - Realm - jdbcRealm - Digest, dass ich SHA-256 (ich schreibe einfach SHA-256 innerhalb Digest-Feld). Dann schrieb ich ein einfaches Java-Programm, um Passwort-Text in SHA-256-Hash zu konvertieren. Ich füge diesen Hash dann in mein Passwortfeld in der Datenbank ein. Das Passwortfeld hat übrigens den Typ varchar (30). Ich kann mich nicht mehr einloggen. Eine Sache, die ich bemerke, dass mein einfaches Java-Programm jedes Mal für dasselbe Textfeld unterschiedlichen Hash erzeugte.Glassfish Security - jdbcRealm: Wie konfiguriere ich Login mit SHA-256 Digest

Hier sind meine einfache Java-Programm:

 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

Ich habe Probleme mit der Migration von 4.0 zu 4.1.1 http://StackOverflow.com/Questions/40686737/migration-from-glassfish-4-0-to-glassfish-4-1-1-jdbc-realm -Ausgabe – Bikram

Antwort

16

Die jdbcRealm ermöglicht Codierung Werte von Hex-oder Base64. Sie müssen eine dieser in Ihrem Realm-Konfiguration spezifizieren und in Ihrem Code, wandeln das Byte-Array in einem der folgenden Formate:

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, Kennwortfeld ist Typ varchar (30)

Sie müssen die Größe Ihres Passwortfelds vergrößern. SHA-256 base64- und hex-Werte haben eine Länge von 45 bzw. 64 Zeichen.

+0

Super !!! Du bist ein Lebensretter. Ich habe mich schon eine ganze Weile mit diesem Ding beschäftigt. Vielen Dank. Suck, dass ich dir nur 1 Stimme geben kann. –

+0

Ich habe Probleme mit der Migration von 4.0 auf 4.1.1 http://StackOverflow.com/Questions/40686737/migration-from-glassfish-4-0-to-glassfish-4-1-1-jdbc-realm-issue – Bikram