Na primeira parte desta série abordei alguns conceitos básicos e terminei falando de hashing e como ele serve pra gerarmos um valor único e irreversível a partir de um input de dados.
Já que nao conseguimos reverter o valor gerado a partir de uma funçao de hashing como podemos utiliza-lo como forma de proteçao de senha?
public void CadastroUsuario(string login, string senha /* outros dados do usuário */)
{
var hashSenha = GerarHash(senha);
Usuarios.Armazenar(login, hashSenha /* outros dados do usuário */ )
}
public bool LoginEhValido(string login, string senha)
{
var hashUsuarioArmazenado = Usuarios.RecuperarHash(login);
var hashSenha = GerarHash(senha);
return hashSenha == hashUsuarioArmazenado;
}
Além de garantirmos que mesmo que nossa base de dados caia em maos erradas ninguém terá acesso a senha original do usuário também garantimos que nós (mantenedores da aplicaçao) também nao teremos acesso o que também é muito bom já que a maioria dos usuários utiliza a mesma senha em mais de uma aplicaçao.
Pra entender melhor a idéia de um algorítmo desse tipo vamos implementar uma versao bem simplificada:
public static string GerarHash(string entrada)
{
var hash = entrada.Sum(caracter => (int) caracter);
return hash.ToString();
}
GerarHash("senha"); //resultado 527
GerarHash("SENHA"); //resultado 367
GerarHash("ddddM2"); //resultado 527
Podemos perceber algumas coisas neste método:
Como vocês já devem ter concluído este nao é um algoritmo de hashing que devemos usar caso nosso objetivo seja garantir a segurança de nossa aplicaçao já que colisoes sao muito frequentes.
Partindo dai é que surgiu o MD5, um dos algorítmos mais utilizados hoje em dia pra geraçao de hashes. Em .NET ele está disponível nativamente por meio da classe MD5 existente no namespace System.Security.Criptography. Um exemplo de uso pode ser encontrado na página oficial de documentaçao no MSDN e o pseudo código e algumas implementaçoes simples na Wikipedia.
Apesar de MD5 ser um bom algorítmo ele já nao é mais considerado seguro e pode ser quebrado facilmente. Contudo existem outras maneiras de mesmo com MD5 garantir que as senhas de seus usuários estejam seguras e é sobre isso que vou falar no próximo post.
Até lá!