Olá Pessoal,
No post de hoje vamos ver como criptografar senha usando o Spring Security. O objetivo é que a senha do usuário não seja salva no seu BD, e já sabemos o motivo de fazer isso. Não vou entrar nos detalhes.
Lets go
Requisitos
- Baixe a versão mais recente do SpringSecurity. (Para o post estou usando a versão 3.2.x)
Starting
Há várias soluções na internet, desde usando o Java puro ou usando APIs, Frameworks para criptografar a senha, e para quem está usando o SpringSecurity no projeto tem uma vantagem: já tem uma classe implementada pelo pessoal do Spring que faz isso em 1 linha. Vejamos a classe que criei a seguir para fazer isso. Vejam como é simples:
public abstract class GenerateHashPasswordUtil { private static Object salt; public static String generateHash(String password) { MessageDigestPasswordEncoder digestPasswordEncoder = getInstanceMessageDisterPassword(); String encodePassword = digestPasswordEncoder.encodePassword(password, salt); return encodePassword; } private static MessageDigestPasswordEncoder getInstanceMessageDisterPassword() { //informo tipo de enconding que desejo MessageDigestPasswordEncoder digestPasswordEncoder = new MessageDigestPasswordEncoder("MD5"); return digestPasswordEncoder; } //método que faz a validação como não usamos salt deixei em null public static boolean isPasswordValid(String password, String hashPassword) { MessageDigestPasswordEncoder digestPasswordEncoder = getInstanceMessageDisterPassword(); return digestPasswordEncoder.isPasswordValid(hashPassword, password, salt); } }
E aqui a classe de teste que valida alguns cenários:
public class GenerateHashPasswordUtilTest { @Test public void testHashWasGenerateWithSuccess() { String password="1234"; assertNotNull(GenerateHashPasswordUtil.generateHash(password)); } @Test public void testValidIfPasswordIsValidAfterHashed(){ String password="brazil"; String hashPassword =GenerateHashPasswordUtil.generateHash(password); boolean expectedValidPassword = GenerateHashPasswordUtil.isPasswordValid(password, hashPassword); assertTrue(expectedValidPassword); } @Test public void testPassWordIsNotEqualToHashCodeGenerated(){ String password = "XPto"; String passwordhash = GenerateHashPasswordUtil.generateHash(password); String passwordTyped = "xPto"; boolean expectedInvalidPassword = GenerateHashPasswordUtil.isPasswordValid(passwordTyped, passwordhash); assertFalse(expectedInvalidPassword); } }
Simples, não? Se quiser ver o código hash basta imprimir no console.
Abraços, vou ficando por aqui.
Muito fácil, eu comecei um projeto com o módulo MVC do Spring e não conhecia o Security, muito bom. Valeu!