Criptografar Senha em JPA

697 views
Skip to first unread message

Kim Tiago

unread,
Sep 27, 2011, 8:54:40 PM9/27/11
to jav...@googlegroups.com
Pessoal,

Alguem sabe como faço para o JPA persistir uma string criptografando-a, tipo uma senha de usuario.

Será que tem alguma annotation pra isso? Já procurei aki e nao achei nada sobre isso...

--
Kim Tiago Baptista
Twitter: @kimtiago

Setorial de Aventureiros - 4º Região / ACeAm

Diretor Associado do Clube de Desbravadores
Thiago White - 4º Região / ACeAm



Bruno Maomeh

unread,
Sep 27, 2011, 9:23:27 PM9/27/11
to jav...@googlegroups.com
eu desconheço algo integrado ao jpa.. o que eu sempre fiz foi catar código pronto na internet.. :)



--
Você recebeu esta mensagem por que é membro do Javasf
http://groups.google.com/group/javasf
 
Conheça também o Java Brazil: http://groups.google.com/group/thejavabrazil



--
Bruno Maomeh
   http://brunomaomeh.wordpress.com

Gustavo Souza

unread,
Sep 27, 2011, 10:42:59 PM9/27/11
to jav...@googlegroups.com
não pode enviar essa String já criptografada para o JPA?

Qual seria o motivo de querer fazer isso direto no JPA e nao em uma classe extra?
Att,

Gustavo Souza
53 9163.2838
msn: gustavo...@gmail.com
linux user: #533652
twitter: @gustavocdesouza

Kim Tiago

unread,
Sep 27, 2011, 10:50:04 PM9/27/11
to jav...@googlegroups.com
Posso fazer isso sim,

Só queria saber se o JPA já fazia isso com alguma annotation, mas pelo q eu toh vendo nao faz nao...

Vou usar o Commons Codec da Apache, com uma linha de comando resolve meu problema.

Vlw

2011/9/27 Gustavo Souza <gustavo...@gmail.com>

Flavio Cysne

unread,
Sep 28, 2011, 7:22:08 AM9/28/11
to jav...@googlegroups.com
Acho que pode usar o hibernate.query_substitutions com a função PASSWORD e definir o hql do insert e do update usando essa função para o campo a ter o valor criptografado.

Eu conheço a função PASSWORD do MySQL e, se não me engano, no Orable também tem o mesmo nome. Mas para outros SGBDs teria que ver qual é o nome.

Um detalhe de gravar senhas criptografadas é que, se usar criptografia assíncrona, não dá p/ recuperar o valor original, o que força a comparar os valores sempre criptografados.

Espero ter ajudado.
Flávio Cysne

Kenji

unread,
Sep 28, 2011, 8:34:04 AM9/28/11
to jav...@googlegroups.com
não esqueça da pitada de sal :-)


[]

Kenji

Flavio Cysne

unread,
Sep 28, 2011, 9:29:01 AM9/28/11
to jav...@googlegroups.com
Gostei da referência, Kenji. Muito boa. Obrigado por compartilhá-la.

Jean Jorge Michel

unread,
Sep 28, 2011, 12:54:57 PM9/28/11
to jav...@googlegroups.com
Nada mais, nada menos:

http://blog.caelum.com.br/guardando-senhas-criptografadas-em-java/


--
Best regards,
Jean J. Michel

* Sent from my cellphone, please forgive the lack of accents and punctuation marks ;)
My blogs: http://www.jeanjmichel.blogspot.com and http://www.anonymousbiker.wordpress.com
My Twitter: http://twitter.com/jeanjmichel

David Faulstich

unread,
Sep 28, 2011, 5:00:39 PM9/28/11
to jav...@googlegroups.com
Nada mais menos que:

package br.com.infosolo.snit.negocio.ejb;

import java.security.NoSuchAlgorithmException;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.Query;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;

import br.com.infosolo.snit.entidades.Usuario;
import br.com.infosolo.snit.excecao.UsuarioExcecao;
import br.com.infosolo.snit.util.UsuarioUtil;


@Stateless
@Name("usuarioNegocio")
public class UsuarioNegocio implements UsuarioNegocioLocal {

	@In (value="entityManager")
	private EntityManager em;
	
	@Logger
	private org.jboss.seam.log.Log log;	
	
	/*
	 * (non-Javadoc)
	 * @see br.com.infosolo.negocio.ejb.UsuarioNegocioLocal#salvarUsuario(br.com.infosolo.snit.entidades.Usuario)
	 */
	public void salvarUsuario(Usuario usuario){
		if(usuario==null){
			throw new UsuarioExcecao("erro.usuario.obrigadorio");
		}
		String senha = "";
		try {
			senha = UsuarioUtil.md5(usuario.getDeSenha());
		} catch (NoSuchAlgorithmException nsae) {
			throw new UsuarioExcecao("erro.md5.senha.usuario", nsae);
		}
		usuario.setDeSenha(senha);
		em.persist(usuario);
	}
	
	/*
	 * (non-Javadoc)
	 * @see br.com.infosolo.negocio.ejb.UsuarioNegocioLocal#recuperarUsuario(java.lang.String, java.lang.String)
	 */
	public Usuario recuperarUsuario(String login, String senha){
		Usuario usuario = null;
		try {
			senha = UsuarioUtil.md5(senha);
		} catch (NoSuchAlgorithmException nsae) {
			throw new UsuarioExcecao("erro.md5.senha.usuario", nsae);
		}
		try {
			Query query = em.createNamedQuery("usuario.retornarUsuarioPorLoginSenha");
			query.setParameter("login", login);
			query.setParameter("senha", senha);
			usuario = (Usuario) query.getSingleResult();
		} catch (javax.persistence.NoResultException nre) {
			log.info("Falha ao pesquisar usuário por senha: {0}", login);
			usuario = null;
		}
		return usuario;
	}
}


---

package br.com.infosolo.snit.util; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public final class UsuarioUtil { /** * Método para encriptar senhas. * @param senha * @return String com a senha md5 encriptada. * @throws NoSuchAlgorithmException */ public static String md5(String senha) throws NoSuchAlgorithmException { MessageDigest messageDigest = MessageDigest.getInstance("MD5"); BigInteger hash = new BigInteger(1, messageDigest.digest(senha.getBytes())); return hash.toString(16); } }

Acho que isto dá.

Jeff Prestes

unread,
Sep 28, 2011, 10:48:45 PM9/28/11
to jav...@googlegroups.com

Marcos

unread,
Sep 28, 2011, 9:31:17 PM9/28/11
to javasf: JavaServer Faces Group
Vc pode criar uma classe separada, como mostrado abaixo, somente para
fazer a criptografia
e para usar: CriptografiaMD5.md5("minhaSenha") // metodo retorna
criptografia do parametro informado

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class CriptografiaMD5 {

public static String md5(String senha) {

String sen = "";
MessageDigest md = null;

try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}

BigInteger hash = new BigInteger(1, md.digest(senha.getBytes()));
sen = hash.toString(16);
return sen;
}
}

On 27 set, 21:54, Kim Tiago <kimti...@gmail.com> wrote:
> Pessoal,
>
> Alguem sabe como faço para o JPA persistir uma string criptografando-a, tipo
> uma senha de usuario.
>
> Será que tem alguma annotation pra isso? Já procurei aki e nao achei nada
> sobre isso...
>
> --
> *Kim Tiago Baptista*
> Twitter: @kimtiago
> *
> Setorial de Aventureiros - 4º Região / ACeAm
> Diretor Associado do Clube de Desbravadores
> Thiago White - 4º Região / ACeAm*

Alejandro Mesias

unread,
Sep 29, 2011, 6:31:15 AM9/29/11
to jav...@googlegroups.com
O que você pode fazer é colocar um listener para o Bean no JPA para que ele execute uma rotina antes de persistir o objeto.
Algo como @BeforePesist no proprio bean, ou fora dele. Tem algumas alternativas para deixar isso transparente para o programador.

2011/9/28 Jeff Prestes <jeffp...@gmail.com>



--
======================================
| Alejandro Mesias André Nebra Perez
| Java/Python/Js/Something else Developer
| Twitter: @meszias
| Linux User #442506
| Campinas - SP - Brasil - South America
======================================

Kim Tiago

unread,
Sep 29, 2011, 8:53:05 AM9/29/11
to jav...@googlegroups.com
Pessoal,

Obrigado mais uma vez pela ajuda de todos.

Resolvi usar o commons codec da apache, resolveu meu problema.

Abraços!

2011/9/29 Alejandro Mesias <mes...@gmail.com>



--
Reply all
Reply to author
Forward
0 new messages