为了开发目的,我一直在以纯文本格式存储密码,但希望开始存储散列,但迄今尚未成功让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