Cadastro de Usuário com Senha Criptografada

20 respostas
Marcio_Nogueira
Método para criptografar a senha:
public String criptografa(String senha){
		try{
		 MessageDigest digest = MessageDigest.getInstance("MD5");
		               digest.update(senha.getBytes());
		 BASE64Encoder encoder = new BASE64Encoder();
		        return encoder.encode(digest.digest());
		}catch(NoSuchAlgorithmException ns){
			ns.printStackTrace();
		}
		return senha;
	}
Método para cadastrar com senha criptografada:
public void cadastrarUsuario() throws UsuarioDAOException, SQLException, Exception{
		UsuarioService service = new UsuarioService();
		Criptografa criptografa = new Criptografa();
		            
		Usuario usr = new Usuario();
				usr.setNome(nome);
				usr.setLogin(login);
				usr.setSenha(criptografa.criptografa(senha));
		service.cadastrarUsuario(usr);
	}

20 Respostas

A

alguma duvida???

Marcio_Nogueira

Não, este tópico é uma dica para quem quiser fazer um cadastro de usuário com a senha criptografada. :wink:

A

ha ta… :smiley:

F

Cara eu ia pesquisar sobre isso mas estava deixando para depois…
Ai eu vi agora e já vou aproveitar para utilizar -

muito obrigado!

getAdicted

Valeu o/…

[]'s

A

Parabéns pela iniciativa Marcio_Nogueira.

É o tipo de código que em algum momento iremos precisar.

Gostaria apenas de fazer algumas considerações:

  • O uso da classe BASE64Encoder não é recomendado por ser do pacote sun, que pode mudar de uma versão para outra. (Imagino que seja a classe sun.misc.BASE64Encoder)
    Para realizar este passo é melhor utilizar uma lib de terceiros ou desenvolver uma própria.

  • É recomendado utilizar a versão do getBytes() que recebe um Charset como parâmetro.

  • Por último, é recomendado adicionar um salt (um prefixo, numa tradução livre) na hora de gerar o hash da senha.
    Esse salt impede que senhas iguais gerem o mesmo hash, tornando muito mais dificil um ataque de força bruta.
    Esse salt é um valor qualquer que varia por login (pode ser até o próprio login).
    Mesmo que dois usuários escolham a mesma senha, concatenando esse salt, os dois hashs gerados serão completamente diferentes.

R

Sei que isso vai de programador para programador e tudo mais… Caso for utilizar JDBC no projeto, seria mais simples utilizar o MD5 ao inserir dados no banco, não acha ?

exemplo:

open();
stmt = con.PrepareStatement("insert into usuario values(null,?,md5(?))");
stmt.setString(1, p.getLogin);
stmt.setString(2, p.getSenha);
stmt.execute();
stmt.close();
close();

Abraços. :smiley:

A

cara,

vc pode garantir que todo banco de dados tem essa funcao md5?
se sim, sua idea é muito boa.
se não, acho que do nosso amigo do post melhor.

t+

R

Digo o banco de dados MySQL, que seria melhorzinho para “estudar”… algo do tipo…

R

Mas a ideia do amigo do post é bem interessante e funcional. Usando algum banco de dados que não tenha esta função… Seria ótimo utilizar sim o que o amigo do post disse… só dei mais uma opção… caso o BD tenha esta função.

luxu

vou deixar o meu q peguei no fórum da caelum...

package br.com.luxu.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

import javax.persistence.EntityManager;

import br.com.luxu.classe.Funcionario;
import br.com.luxu.classe.Usuario;
import br.com.luxu.util.EntityManagerUtil;

public class MetodoCriptografar {

	public static void main(String[] args) {
		Usuario usuario = new Usuario();
		EntityManager entityManager = EntityManagerUtil.getEntityManager();
		Funcionario funcionario = new Funcionario();
		funcionario = entityManager.find(Funcionario.class, 2);
		System.out.println("Nome: "+funcionario.getNome());

		usuario.setLogin("admin");
		usuario.setFuncionario(funcionario);
		usuario.setSenha(criptografia("admin"));
		usuario.setAtivo("Sim");
		usuario.setNivelacesso("Gerente");
		
		entityManager.getTransaction().begin();
		entityManager.persist(usuario);
		entityManager.getTransaction().commit();
		entityManager.close();
		/*
		usuario = entityManager.find(Usuario.class, 3);
		System.out.println("Nome: "+usuario.getFuncionario());
		System.out.println("Login: "+usuario.getLogin());
		System.out.println("Senha: "+usuario.getSenha());
		System.out.println("Ativo: "+usuario.getAtivo());
		System.out.println("Nível: "+usuario.getNivelacesso());
		*/
		//criptografia("luxu");
	}
	
	public static String criptografia(String original)
	{
		String senha = null;
		MessageDigest algoritmo;
		byte messageDigest[];
		StringBuilder hexString;
		try {
			//algoritmo =MessageDigest.getInstance("SHA-256");// 64 letras
			algoritmo = MessageDigest.getInstance("MD5");  // 32 letras
			messageDigest = algoritmo.digest(original.getBytes("UTF-8"));
			hexString = new StringBuilder();
			for (byte b : messageDigest) {
				hexString.append(String.format("%02X", 0xFF & b));
			}
			senha = hexString.toString();
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		System.out.println("Senha normal: "+original+" - Senha criptografada: "+senha);
		return senha;
	}
}
Marcio_Nogueira

Para quê complicar a vida das pessoas com um código longo e sujeito a falhas?
Um bom código deve ser simples, fácil de entender e dar manutenção.

alexandre.marques

É possivel implementar esse código em um Filtro para Servlet? você tem algum modelo desse código implementado em um filtro? eu estou aprendendo a usar Filtro e session e seria legal criptografar a senha.

Parabéns! :thumbup:

ruben_m

rsmoraes:
Sei que isso vai de programador para programador e tudo mais… Caso for utilizar JDBC no projeto, seria mais simples utilizar o MD5 ao inserir dados no banco, não acha ?

exemplo:

open();
stmt = con.PrepareStatement("insert into usuario values(null,?,md5(?))");
stmt.setString(1, p.getLogin);
stmt.setString(2, p.getSenha);
stmt.execute();
stmt.close();
close();

Abraços. :D

Concordo que esta ideia é a mais Pratica , aqui esta em cima é muito dependente da linguagem Java em Sim, imaginem-se se for um Banco que também precisa ser acessado via Web ou outra linguagem ? Ja não se poderia Fazer Autenticações e cadastros!

Acho que é mais practico fazer criptografias ao nivel de Banco de Dados , é so investigar um pouco mais o seu SGBD

A

Na verdade, esse código acima não depende em nada do Java. O MD5 é um algoritmo que pode ser implementado em virtualmente qualquer linguagem.
O resultado da função mysql não será diferente da função no java, exceto talvez pelo formato base64 (não sei como o mysql retorna a função md5 dele).

É realmente mas simples, mas tem algumas limitações.

Toda vez, por exemplo, que tentar validar a senha terá que ir ao banco de dados chamar a função do mysql.
Se quisesse pedir para o usuário digitar novamente a senha para uma operação sensível, poderia ter o hash armazenado na própria sessão do usuário.
Com essa abordagem, teria que sempre acessar o bd.

Você acaba dando a responsabilidade de validar senha para o bd e não para aplicação.

ruben_m

Mas eu usei isso no intuito de que a BD é unica e os Aplicativos podem ser Muitos …

jaissonduarte

por isso que eu amo o GUJ o pessoal sempre esta pronto a ajudar

gnucleber

Muito bom amigo, parabéns! :smiley:

Eu estava procurando exatamente isso, pois estou com um livro que mostra como trabalhar com MD5 no Spring Security mas não fala como gravar em MD5

F

Nao sei se to ressucitando o topico, mas muito obrigado pelo codigo cara! vo usa no projeto da facul

MusashiBR

No caso de validar a senha para login, usa o mesmo metodo para verificar se está correto?

Criado 28 de dezembro de 2011
Ultima resposta 23 de set. de 2013
Respostas 20
Participantes 13