Segurança Glassfish – jdbcRealm: Como configurar o login com o resumo SHA-256

Eu uso o jdbcRealm para segurança no meu glassfish v3.0.1 b22. Está configurado para usar a tabela USER dentro do meu database para autenticação, seguindo este blog: http://blogs.oracle.com/foo/entry/mort_learns_jdbc_realm_authentication . Eu tenho que funcionar bem, se eu deixar o algoritmo de resumo como texto simples. No entanto, quando eu tento usar SHA-256 para o algoritmo digest, ele pára de funcionar. O que eu fiz é especificar no Glassfish – Security – Realm – jdbcRealm – digest que eu quero SHA-256 (eu apenas digito SHA-256 dentro do campo digest). Então eu escrevi um programa Java simples para converter texto de senha em hash SHA-256. Em seguida, colo esse hash dentro do meu campo de senha no database. A propósito, o campo password é tipo varchar (30). Eu não consigo mais entrar. Uma coisa é que noto que meu programa Java simples gerava um hash diferente a cada vez para o mesmo campo de texto.

Abaixo está o meu programa java simples:

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

O jdbcRealm permite codificar valores hex ou base64. Você precisa especificar um deles na sua configuração de região e, em seu código, converter a matriz de bytes em um desses formatos:

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, o campo da senha é tipo varchar (30)

Você precisará aumentar o tamanho do seu campo de senha. Os valores SHA-256 base64 e hexadecimais têm 45 e 64 caracteres, respectivamente.

    Intereting Posts