Безопасность Glassfish - jdbcRealm: Как настроить вход в систему с дайджестом SHA-256
Я использую jdbcRealm для безопасности в моем glassfish v3.0.1 b22. Он настроен так, чтобы он использовал таблицу 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-программа каждый раз генерировала разные хэши для одного и того же текстового поля.
Ниже приведены мои простые 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());
1 ответ
JdbcRealm позволяет кодировать значения hex или base64. Вам необходимо указать один из них в конфигурации вашей области и в вашем коде, преобразовать байтовый массив в один из следующих форматов:
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());
Кстати, поле пароля типа varchar(30)
Вам нужно будет увеличить размер поля пароля. Значения SHA-256 base64 и hex имеют длину 45 и 64 символа соответственно.