出于开发目的,我一直以纯文本形式存储我的密码,但想开始存储哈希值,但由于以下 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 Security - jdbcRealm: How to configure login with SHA-256 digest建议您确实需要这样做。
所以我想我想知道的是,GlassFish 是否需要一个字符串(VARCHAR)或一个字节 [](BLOB)作为数据库中的密码字段,我是否正确地散列密码,另外 Base64 编码是否正确密码哈希?
谢谢!