我在GlassFish中V3.0.1 B22使用jdbcRealm安全。它设置,以便它遵循这个博客使用USER表我的数据库中进行身份验证: HTTP ://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication 。我把它工作正常,如果我离开摘要算法为纯文本。然而,当我尝试使用SHA-256摘要算法,它停止工作。 我所做的是指定的Glassfish - 安全 - 境界 - jdbcRealm - 消化,我想SHA-256(我只需键入SHA-256内部消化场)。然后我写了一个简单的Java程序密码文本转换成SHA-256散列。然后,我贴我的密码字段中散列在数据库中。顺便说,密码字段的类型为varchar(30)。我不能再登录。有一件事我注意到,我的简单的Java程序对同一文本字段每次都产生不同的哈希。

下面是我的简单的Java程序:

        MessageDigest md = MessageDigest.getInstance("SHA-256");
        String text = "admin";
        md.update(text.getBytes("UTF-8"));
        byte[] digest = md.digest();
        System.out.println(digest.toString());
有帮助吗?

解决方案

在jdbcRealm允许编码十六进制或BASE64的值。你需要指定你的域配置和代码的其中之一,该字节数组转换为这些格式之一:

<强> Base64的:

import com.sun.org.apache.xml.internal.security.utils.Base64;
...
byte[] digest = md.digest();
System.out.println(Base64.encode(digest));

<强>六角:

...
byte[] digest = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < digest.length; i++) {
    String hex = Integer.toHexString(0xff & digest[i]);
    if (hex.length() == 1) sb.append('0');
    sb.append(hex);
}
System.out.println(sb.toString());
  

<强>顺便说一句,密码字段的类型为varchar(30)

您将需要增加你的密码字段的大小。 SHA-256的base64和十六进制值是长度为45个至64个字符,分别

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top