Problema Geração de MD5 + Spring Security

7 respostas
J

Olá!

Estou utilizando spring security em uma aplicação e estou enfrentando o seguinte problema, quando crio alguma senha com acento não consigo logar no meu sistema.
Já estou salvando a senha em MD5 desta forma:

MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
    	messageDigest.update(senha.getBytes(),0, senha.length());  
    	senhaMD5= new BigInteger(1,messageDigest.digest()).toString(16);  
    	if (senhaMD5.length() < 32) {
    		senhaMD5= "0" + senhaMD5; 
    	}

e minha configuração no spring é:

<security:password-encoder hash="md5"/>

Alguém tem alguma idéia?

Desde já agradeço =]

7 Respostas

L

Acho que o problema é aqui:

messageDigest.update(senha.getBytes(),0, senha.length());

Testa assim:

byte[] bytesSenha = senha.getBytes(); messageDigest.update(bytesSenha); String senhaMD5 = new String(messageDigest.digest());

J

Olá Isjunior, obrigado pela resposta, mas ainda não resolveu foi gerado alguns caracteres estranhos da forma que vc sugeriu.

L

Vc tem que aplicar o base64 ou hex para deixar de acordo com o que vc precisa.

J

Olá Pessoal!

Na verdade o problema me parece ser de encoding, ou seja, no form de login do spring está bagunçando a acentuação.

Alguém tem alguma idéia?

L

Foi o que eu disse, vc além de aplicar o MD5 vc precisa aplicar base64 ou hex nos bytes.

J

Olá!

Então na verdade fiz uns testes e percebi quando o username está com acento não é possível logar, então acho que não é problema na geração do MD5.
Já coloquei um filtro no meu web.xml que seta o encoding para UTF-8.
Alguém tem alguma idéia?

L

Olha lá na documentação deles:

http://static.springsource.org/spring-security/site/docs/3.2.x/reference/ns-config.html#ns-password-encoder

Por padrão é aplicado o base64 na senha.
<security:password-encoder base64="true" hash="md5">
Então para obter a senha dessa forma tem que fazer isso:
import java.security.MessageDigest;

import sun.misc.BASE64Encoder;

public class SenhaTest {

	public static void main(String[] args) {
		try {
			String senha = "SenhaMuitoComplicada";
			MessageDigest messageDigest = MessageDigest.getInstance("MD5");
			messageDigest.update(senha.getBytes());
			byte[] md5 = messageDigest.digest();
			String base64 = new BASE64Encoder().encode(md5);
			System.out.println("Senha    : " + senha);
			System.out.println("Senha(MD5: " + base64);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

}
Sobre o encoding vc pode ajustar na página, no servidor e no sistema operacional.Vale a pensa criar um JSP com um campo de texto para verificar se está realmente com problema de charset. É bem mais facil testar e arumar.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%
	String text = request.getParameter("text");
%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
	<form action="index.jsp">
		<input type="text" id="text" name="text" value="<%= text %>" />
		<input type="submit" id="submit" name="submit" value="Enviar" />
	</form>
</body>
</html>
Criado 12 de março de 2013
Ultima resposta 13 de mar. de 2013
Respostas 7
Participantes 2