Hash de senhas no ASP.NET CoreHash passwords in ASP.NET Core

A base de código do proteção de dados inclui um pacote Microsoft.AspNetCore.Cryptography.KeyDerivation que contém funções de derivação de chave de criptografia.The data protection code base includes a package Microsoft.AspNetCore.Cryptography.KeyDerivation which contains cryptographic key derivation functions. Esse pacote é um componente autônomo e não tem nenhuma dependência no restante do sistema de proteção de dados.This package is a standalone component and has no dependencies on the rest of the data protection system. Ele pode ser usado independentemente completamente.It can be used completely independently. A origem existe junto com o código de proteção de dados base como uma conveniência.The source exists alongside the data protection code base as a convenience.

O pacote no momento, oferece um método KeyDerivation.Pbkdf2 que permite o hash de uma senha usando o PBKDF2 algoritmo.The package currently offers a method KeyDerivation.Pbkdf2 which allows hashing a password using the PBKDF2 algorithm. Essa API é muito semelhante à existente do .NET Framework Rfc2898DeriveBytes tipo, mas há três diferenças importantes:This API is very similar to the .NET Framework's existing Rfc2898DeriveBytes type, but there are three important distinctions:

  1. O KeyDerivation.Pbkdf2 método dá suporte ao consumo PRFs vários (atualmente HMACSHA1, HMACSHA256, e HMACSHA512), enquanto o Rfc2898DeriveBytes digite dá suporte apenas à HMACSHA1.The KeyDerivation.Pbkdf2 method supports consuming multiple PRFs (currently HMACSHA1, HMACSHA256, and HMACSHA512), whereas the Rfc2898DeriveBytes type only supports HMACSHA1.

  2. O KeyDerivation.Pbkdf2 método detecta o sistema operacional atual e tenta escolher a implementação mais otimizada de rotina, fornecendo um desempenho muito melhor em alguns casos.The KeyDerivation.Pbkdf2 method detects the current operating system and attempts to choose the most optimized implementation of the routine, providing much better performance in certain cases. (No Windows 8, ele oferece cerca de 10 vezes a taxa de transferência Rfc2898DeriveBytes.)(On Windows 8, it offers around 10x the throughput of Rfc2898DeriveBytes.)

  3. O KeyDerivation.Pbkdf2 método requer que o chamador especificar todos os parâmetros (salt, PRF e contagem de iteração).The KeyDerivation.Pbkdf2 method requires the caller to specify all parameters (salt, PRF, and iteration count). O Rfc2898DeriveBytes tipo fornece valores padrão para eles.The Rfc2898DeriveBytes type provides default values for these.

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 secure PRNG
        byte[] salt = new byte[128 / 8];
        using (var rng = RandomNumberGenerator.Create())
        {
            rng.GetBytes(salt);
        }
        Console.WriteLine($"Salt: {Convert.ToBase64String(salt)}");
 
        // derive a 256-bit subkey (use HMACSHA1 with 10,000 iterations)
        string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
            password: password,
            salt: salt,
            prf: KeyDerivationPrf.HMACSHA1,
            iterationCount: 10000,
            numBytesRequested: 256 / 8));
        Console.WriteLine($"Hashed: {hashed}");
    }
}
 
/*
 * SAMPLE OUTPUT
 *
 * Enter a password: Xtw9NMgx
 * Salt: NZsP6NnmfBuYeJrrAKNuVQ==
 * Hashed: /OOoOer10+tGwTRDTrQSoeCxVTFr6dtYly7d0cPxIak=
 */

Consulte a código-fonte para o ASP.NET Core Identity PasswordHasher caso de uso de tipo para um mundo real.See the source code for ASP.NET Core Identity's PasswordHasher type for a real-world use case.