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!

Referências