简体   繁体   English

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

[英]Glassfish Security - jdbcRealm: How to configure login with SHA-256 digest

I use jdbcRealm for security in my glassfish v3.0.1 b22. 我在glassfish v3.0.1 b22中使用jdbcRealm来保证安全性。 It is set up so that it use the USER table inside my database for authentication by following this blog: http://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication . 它被设置为使用我的数据库中的USER表进行身份验证,方法是访问以下博客: http//blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication I got it working fine, if I leave the digest algorithm as plain text. 如果我将摘要算法保留为纯文本,我的工作正常。 However when i try to use SHA-256 for digest algorithm, it stop working. 但是,当我尝试使用SHA-256进行摘要算法时,它会停止工作。 What I did is specify in Glassfish - Security - Realm - jdbcRealm - digest that I want SHA-256 (I just type SHA-256 inside digest field). 我所做的是在Glassfish中指定 - 安全 - 领域 - jdbcRealm - 我想要SHA-256的摘要(我只是在摘要字段中键入SHA-256)。 Then I wrote a simple Java program to convert password text into SHA-256 hash. 然后我写了一个简单的Java程序,将密码文本转换为SHA-256哈希。 I then paste that hash inside my password field in the database. 然后我将该哈希粘贴到数据库中的密码字段中。 By the way, password field is type varchar(30). 顺便说一句,密码字段是类型varchar(30)。 I cant log in anymore. 我不能再登录了。 One thing I notice that my simple Java program generated different hash every time for the same text field. 有一点我注意到我的简单Java程序每次为同一文本字段生成不同的哈希值。

Below are my simple java program: 下面是我简单的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());

The jdbcRealm allows encoding values of hex or base64. jdbcRealm允许编码十六进制或base64的值。 You need to specify one of these in your realm configuration and in your code, convert the byte array into one of these formats: 您需要在领域配置和代码中指定其中一个,将字节数组转换为以下格式之一:

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());

btw, password field is type varchar(30) 顺便说一句,密码字段是类型varchar(30)

You'll need to increase the size of your password field. 您需要增加密码字段的大小。 SHA-256 base64 and hex values are 45 and 64 characters in length, respectively. SHA-256 base64和十六进制值的长度分别为45和64个字符。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM