Glassfish Security - jdbcRealm: Как настроить вход в систему с использованием дайджеста SHA-256

I Я использую jdbcRealm для обеспечения безопасности в моем glassfish v3 .0.1 b22. Он настроен так, чтобы он использовал таблицу USER в моей базе данных для аутентификации, следуя этому блогу: http://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication . У меня все работает нормально, если я оставлю алгоритм дайджеста в виде простого текста. Однако, когда я пытаюсь использовать SHA-256 для алгоритма дайджеста, он перестает работать.

Я использую jdbcRealm для обеспечения безопасности в моем glassfish v3.0.1 b22. Он настроен так, чтобы он использовал таблицу USER в моей базе данных для аутентификации, следуя этому блогу: http://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication . У меня все работает нормально, если я оставлю алгоритм дайджеста в виде простого текста. Однако, когда я пытаюсь использовать 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());

10
задан PhearOfRayne 4 December 2013 в 21:40
поделиться

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 и шестнадцатеричные значения имеют длину 45 и 64 символа соответственно.

17
ответ дан 3 December 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: