Hashkennwörter in ASP.NET Core

Die Codebasis für den Datenschutz enthält das Paket Microsoft.AspNetCore.Cryptography.KeyDerivation, das kryptografische Schlüsselableitungsfunktionen enthält. Dieses Paket ist eine eigenständige Komponente und hat keine Abhängigkeiten vom Rest des Datenschutzsystems. Sie kann vollständig unabhängig verwendet werden. Die Quelle ist der Einfachheit halber zusammen mit der Codebasis für den Datenschutz vorhanden.

Das Paket bietet derzeit eine Methode, KeyDerivation.Pbkdf2 die das Hashing eines Kennworts mithilfe des KeyDerivation.Pbkdf2 Diese API ähnelt dem vorhandenen Rfc2898DeriveBytes-Typdes .NET Framework, es gibt jedoch drei wichtige Unterschiede:

  1. Die KeyDerivation.Pbkdf2 -Methode unterstützt die Verwendung mehrerer PRFs (derzeit HMACSHA1 , und ), während der Typ nur HMACSHA256HMACSHA512Rfc2898DeriveBytesHMACSHA1 unterstützt.

  2. Die -Methode erkennt das aktuelle Betriebssystem und versucht, die am besten optimierte Implementierung der Routine zu wählen, was in bestimmten Fällen eine KeyDerivation.Pbkdf2 deutlich bessere Leistung bietet. (Auf Windows 8 bietet es ungefähr das Zehn fache des Durchsatzes von Rfc2898DeriveBytes .)

  3. Für KeyDerivation.Pbkdf2 die -Methode muss der Aufrufer alle Parameter angeben (Salt, PRF und Iterationsanzahl). Der Rfc2898DeriveBytes -Typ stellt Standardwerte für diese zur

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=
 */

Weitere Informationen finden Sie unter /Extensions.Core/src/PasswordHasher.cs" data-linktype="external">source code for 's type for a ASP.NET Core Identity real-world use case (Identity /Extensions.Core/src/PasswordHasher.cs) data-linktype="external">-Quellcode für den Typ von für einen realen PasswordHasher Fall.