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.
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.
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 |
---|---|
[email protected] | $7$F6....6....9gqK.Bssjha0tJEgp57Ehbk/yZsfsArIoZ0XwT.K7l2$sBToaWqQElAiXzU7CpK1/7Cal5queMNiB.moxjOLtB7 |
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: 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:
UserName | PasswordHash |
---|---|
[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:
UserName | PasswordHash |
---|---|
[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:
UserName | PasswordHash |
---|---|
[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!