Glassfish Security - 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());

person Thang Pham    schedule 09.08.2010    source источник
comment
У меня проблема с переходом с 4.0 на 4.1.1 stackoverflow.com/questions/40686737/   -  person Bikram    schedule 27.11.2016


Ответы (1)


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());

кстати, поле пароля имеет тип varchar (30)

Вам нужно будет увеличить размер поля вашего пароля. SHA-256 base64 и шестнадцатеричные значения имеют длину 45 и 64 символа соответственно.

person Jordan Allan    schedule 10.08.2010
comment
Супер!!! Вы спасаете жизнь. Я давно занимаюсь этим вопросом. Большое Вам спасибо. Отстой, что я могу отдать вам только один голос. - person Thang Pham; 10.08.2010
comment
У меня проблема с переходом с 4.0 на 4.1.1 stackoverflow.com/questions/40686737/ - person Bikram; 27.11.2016