Segurança - Parte 4 - Melhorando o Hash de senhas no ASP.NET Core Identity
O algoritimo de senha atual do ASP.NET Core Identity é considerado "ok". Autalmente existem implementações melhores e mais seguras. Apresento neste post as implementações de bcrypt, scrypt e Argon2 para ASP.NET Core Identity.
O que é utilizado atualmente?
O ASP.NET Core Identity usa o algoritimo PBKDF2 com HMAC-SHA256. Um salt de 128 bits, uma subchave de 256 bits e 10.000 iterações. Essa contagem de iterações é configurável.
O PBKDF2 é considerado “ok”. É compatível com FIPS e recomendado pelo NIST. No entanto, devido aos avanços de hardware atuais em conjunto aos blockchains já não é tão seguro atualmente. Como ataques baseados em GPU, e é frequentemente considerado fraco em comparação com as outras alternativas-.
Alternativas
Hoje as melhores criptografias para senha são Argon2, Scrypt e BCrypt.
Se você ainda não viu as artigos anteriores, abordando os por quês de hash de senha. Quais os beneficios de utilizar um algoritimo de hash diferente do MD5 e SHA-*.
Entenda por que o Argon2 é considerado atualmente a melhor opção e inclusive recomendado pelo OWASP. Veja aqui:
Utilizando o Argon2
Crie um novo projeto ASP.NET Core.
Selecione o tipo Web Application (Model-View-Controller). Nas opções de autenticação, clique em Change e altere para Individual user accounts in-app. Por fim, clique em Create.
Abra o Nuget e pesquise e instale o componente: JpProject.AspNetCore.PasswordHasher.Argon2.
Após a instalação, abra o Startup.cs e altere o método
ConfigureServices(IServiceCollection services)
Pronto! Agora já está configurado o Hash Argon2.
Basta fazer um select na tabela AspNetUsers e verificar:
UserName | PasswordHash |
---|---|
bruno@bruno.net.br | $7$F6....6....9gqK.Bssjha0tJEgp57Ehbk/yZsfsArIoZ0XwT.K7l2$sBToaWqQElAiXzU7CpK1/7Cal5queMNiB.moxjOLtB7 |
Utilizando o Bcrypt
Crie um novo projeto ASP.NET Core MVC, com Individual User Accoents. Igual do exemplo anterior.
Pesquise no Nuget e instale o componente: JpProject.AspNetCore.PasswordHasher.Bcrypt.
Após a instalação, abra o Startup.cs e altere o método
ConfigureServices(IServiceCollection services)
Pronto! Agora já está configurado o Hash Bcrypt.
Basta fazer um select na tabela AspNetUsers e verificar:
UserName | PasswordHash |
---|---|
bruno@bruno.net.br | $2b$10$4nK1u0TgLTVc1MrXCTHD3uz.kQ7V.FL8h3Ps6RA8u3kGwQNGUhiHO |
Utilizando o Scrypt
Crie um novo projeto ASP.NET Core MVC, com Individual User Accounts. Igual ao exemplo Argon2 anteriormente.
Pesquise no Nuget e instale o componente: JpProject.AspNetCore.PasswordHasher.Scrypt.
Após a instalação, abra o Startup.cs e altere o método
ConfigureServices(IServiceCollection services)
Pronto! Agora já está configurado o Hash Bcrypt.
Basta fazer um select na tabela AspNetUsers e verificar:
UserName | PasswordHash |
---|---|
bruno@bruno.net.br | $7$I6..../....1SOXbRjt6GTOG8eRW4p2ztoEOc43gIEymiHg8Wxf1B4$v4DhwjXhgX7w2Y20uH9Q7mLa6cZIZq/Mrpc3gpVWWhB |
Conclusão
O mais importante é o conceito por trás. A implementação é bem simples, graças as abstrações tanto do componente, quanto das bibliotecas de Criptografia disponiveis para c#.
Espero que tenham gostado. Duvidas? Sugestões? Deixe seus comentários e vamos bater um papo!