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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
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!