爲了開發目的,我一直在以純文本格式存儲密碼,但希望開始存儲散列,但迄今尚未成功讓GlassFish正確驗證哈希密碼,這是因爲以下SecurityException:GlassFish SHA-256摘要式身份驗證
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 Security - jdbcRealm: How to configure login with SHA-256 digest暗示你需要這樣做。
所以我想我想知道的是,GlassFish期望一個字符串(VARCHAR)或一個字節[](BLOB)作爲數據庫中的密碼字段,我是否正確散列密碼,並且它是正確的另外Base64編碼密碼哈希?
謝謝!
非常感謝!事實證明,我確實未能在JDBC領域指定編碼參數,現在它正在正常工作! – Laurens
@Laurens,啊,我在幾個星期前與同樣的野獸搏鬥,所以你有沒有經歷過所有的麻煩。無論如何,該項目的來源將在幾天內提供,因此您將能夠看到正在運行的實施,而不是閱讀我的答案。 –
很高興聽到,期待! – Laurens