Cadastro de Usuário com Senha Criptografada

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:

[code]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);
}[/code]

alguma duvida???

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

ha ta… :smiley:

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

muito obrigado!

Valeu o/…

[]'s

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.

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:

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+

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

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.

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

[code]
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;
}

}[/code]

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.

[quote]É 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:[/quote]

[quote=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[/quote]

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

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.

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

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

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

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