Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo mostra como chamar o método KeyDerivation.Pbkdf2 que permite hashing de uma senha usando o algoritmo PBKDF2.
Advertência
A API KeyDerivation.Pbkdf2 é uma primitiva criptográfica de baixo nível e destina-se a ser usada para integrar aplicativos em um protocolo ou sistema criptográfico existente.
KeyDerivation.Pbkdf2 não deve ser usado em novos aplicativos que suportam login baseado em senha e precisam armazenar senhas com hash em um armazenamento de dados. Novos aplicativos devem usar PasswordHasher. Para obter mais informações sobre PasswordHasher, consulte Explorando o ASP.NET Core Identity PasswordHasher.
A base de código de proteção de dados inclui um pacote NuGet Microsoft.AspNetCore.Cryptography.KeyDerivation que contém funções de derivação de chave criptográfica. Este pacote é um componente independente e não tem dependências do resto do sistema de proteção de dados. Pode ser usado de forma independente. O código-fonte existe ao lado da base de código de proteção de dados para maior conveniência.
Advertência
O código a seguir mostra como usar KeyDerivation.Pbkdf2 para gerar uma chave secreta compartilhada. Não deve ser utilizado para codificar uma senha para gravar num repositório de dados.
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
using System.Security.Cryptography;
Console.Write("Enter a password: ");
string? password = Console.ReadLine();
// Generate a 128-bit salt using a sequence of
// cryptographically strong random bytes.
byte[] salt = RandomNumberGenerator.GetBytes(128 / 8); // divide by 8 to convert bits to bytes
Console.WriteLine($"Salt: {Convert.ToBase64String(salt)}");
// derive a 256-bit subkey (use HMACSHA256 with 100,000 iterations)
string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password!,
salt: salt,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 100000,
numBytesRequested: 256 / 8));
Console.WriteLine($"Hashed: {hashed}");
/*
* SAMPLE OUTPUT
*
* Enter a password: Xtw9NMgx
* Salt: CGYzqeN4plZekNC88Umm1Q==
* Hashed: Gt9Yc4AiIvmsC1QQbe2RZsCIqvoYlst2xbz0Fs8aHnw=
*/
using System;
using System.Security.Cryptography;
using Microsoft.AspNetCore.Cryptography.KeyDerivation;
public class Program
{
public static void Main(string[] args)
{
Console.Write("Enter a password: ");
string password = Console.ReadLine();
// generate a 128-bit salt using a cryptographically strong random sequence of nonzero values
byte[] salt = new byte[128 / 8];
using (var rngCsp = new RNGCryptoServiceProvider())
{
rngCsp.GetNonZeroBytes(salt);
}
Console.WriteLine($"Salt: {Convert.ToBase64String(salt)}");
// derive a 256-bit subkey (use HMACSHA256 with 100,000 iterations)
string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA256,
iterationCount: 100000,
numBytesRequested: 256 / 8));
Console.WriteLine($"Hashed: {hashed}");
}
}
/*
* SAMPLE OUTPUT
*
* Enter a password: Xtw9NMgx
* Salt: CGYzqeN4plZekNC88Umm1Q==
* Hashed: Gt9Yc4AiIvmsC1QQbe2RZsCIqvoYlst2xbz0Fs8aHnw=
*/
Consulte o de código-fonte para ASP.NET tipo de Identity do Core PasswordHasherpara um caso de uso do mundo real.
Observação
Os links de documentação para a fonte de referência do .NET geralmente carregam a ramificação padrão do repositório, que representa o desenvolvimento atual para a próxima versão do .NET. Para selecionar uma tag para uma versão específica, use a lista suspensa Mudar ramos ou tags. Para obter mais informações, consulte Como selecionar uma marca de versão do código-fonte do ASP.NET Core (dotnet/AspNetCore.Docs #26205).