開発目的でパスワードをプレーンテキストで保存していますが、代わりにハッシュの保存を開始したいのですが、次のSecurityExceptionのために、ハッシュ化されたパスワードに対してGlassFishを適切に認証することにまだ成功していません。
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がデータベースのパスワードフィールドとして文字列(VARCHAR)またはbyte [](BLOB)を期待しているのか、パスワードを正しくハッシュしているのか、さらにBase64エンコードするのが正しいのかということです。パスワードハッシュ?
ありがとう!