Я хранил свои пароли в виде простого текста для целей разработки, но хочу вместо этого начать хранить хэши, но пока еще не удалось должным образом обеспечить GlassFish аутентификацию по хеш-паролю из-за следующей исключительной ситуации SecurityException:
SEVERE: jdbcrealm.invaliduserreason
WARNING: WEB9102: Web Login Failed: com.sun.enterprise.security.auth.login.common.LoginException: Login failed: Security Exception
Во-первых, я использую GlassFish 3.1 и настроил дайджест для моей области JDBC на SHA-256.
Мой User
класс имеет следующее поле аннотированного пароля:
@Basic(fetch = FetchType.LAZY)
@Column(length = 45, nullable = false)
private String password;
За хеширование пароля отвечает следующий вспомогательный метод:
private byte[] digest(String input) {
byte[] output = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA-256");
output = md.digest(input.getBytes("UTF-8"));
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(RegistrationController.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnsupportedEncodingException ex) {
Logger.getLogger(RegistrationController.class.getName()).log(Level.SEVERE, null, ex);
}
return output;
}
Затем я устанавливаю пароль для пользователя следующим образом:
u.setPassword(Base64.encode(digest(password)).toString());
Я бы не кодировал Base64, потому что это кажется недокументированным, но этот вопрос: Безопасность Glassfish - jdbcRealm: Как настроить вход в систему с SHA-256-дайджестом предполагает, что вам нужно это сделать.
Так что я думаю, что мне хотелось бы знать, ожидает ли GlassFish String (VARCHAR) или байта [] (BLOB) в качестве поля пароля в базе данных, правильно ли я хэширую пароль, и правильно ли это дополнительно Base64 кодировать пароль хешем?
Спасибо!