Glassfish安全性 – jdbcRealm:如何使用SHA-256摘要配置登录

我在glassfish v3.0.1 b22中使用jdbcRealm来保证安全性。 它的设置是为了通过以下博客使用我的数据库中的USER表进行身份validation: 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允许编码hex或base64的值。 您需要在领域配置和代码中指定其中一个,将字节数组转换为以下格式之一:

Base64编码:

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

hex:

 ... 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和hex值的长度分别为45和64个字符。