O algoritmo de senha padrão do ASP.NET Core Identity é considerado "ok" — faz o trabalho, mas hoje já existem opções melhores. Neste post eu mostro alternativas mais seguras: bcrypt, scrypt e Argon2 integradas ao ASP.NET Core Identity, com orientações para você trocar o provedor de hashing sem inventar moda.

Vou explicar por que cada opção é recomendada, quando escolher uma ou outra e dar exemplos práticos de integração.

senha

O que é utilizado atualmente?

O ASP.NET Core Identity usa PBKDF2 com HMAC-SHA256 por padrão: salt de 128 bits, subkey de 256 bits e 10.000 iterações (valor configurável). Em termos práticos, PBKDF2 é considerado “ok”: é compatível com FIPS e segue recomendações do NIST. Faz o trabalho — mas não é a arma final contra as capacidades de ataque modernas.

Com o avanço do hardware (GPUs, ASICs, rigs paralelos) e a disponibilidade de técnicas mais robustas, PBKDF2 tende a ficar atrás de alternativas projetadas especificamente para resistência a ataques em larga escala.

Alternativas

As opções mais indicadas hoje para password hashing são: Argon2, scrypt e bcrypt. Se você ainda não viu as partes anteriores desta série, vale a leitura antes de trocar o algoritmo: explico por que MD5/SHA-* puros não servem e quais são os benefícios de usar um password hashing function adequada.

Leituras recomendadas:

Se o seu ambiente permitir, prefira Argon2id (melhor escolha hoje). Se não for possível, scrypt ou bcrypt. E antes que alguém pergunte: sim, ajustar parâmetros (memory/time/cost) no seu ambiente é parte do trabalho, não é só trocar a biblioteca e sair por aí.

Utilizando o Argon2

Crie um novo projeto ASP.NET Core.

novo-projeto

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.

webapp

auth

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:

UserNamePasswordHash
[email protected]$7$F6....6....9gqK.Bssjha0tJEgp57Ehbk/yZsfsArIoZ0XwT.K7l2$sBToaWqQElAiXzU7CpK1/7Cal5queMNiB.moxjOLtB7

Utilizando o Argon2

Crie um novo projeto ASP.NET Core.

novo-projeto

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.

webapp

auth

Abra o Nuget e pesquise e instale o componente: NetDevPack.Security.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:

UserNamePasswordHash
[email protected]$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: NetDevPack.Security.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:

UserNamePasswordHash
[email protected]$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: NetDevPack.Security.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:

UserNamePasswordHash
[email protected]$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