Berechnen von Hashes für Kennwörter in ASP.NET Core

Dieser Artikel zeigt, wie Sie die KeyDerivation.Pbkdf2-Methode aufrufen, die es ermöglicht, mithilfe des PBKDF2-Algorithmus einen Hash für ein Kennwort zu berechnen.

Warnung

Die KeyDerivation.Pbkdf2-API ist ein einfaches kryptografisches Primitiv und dient dazu, Apps in ein vorhandenes Protokoll- oder Kryptografiesystem zu integrieren. KeyDerivation.Pbkdf2 sollte in neuen Apps, die eine kennwortbasierte Anmeldung unterstützen und hashbasierte Kennwörter in einem Datenspeicher speichern müssen, nicht verwendet werden. Neue Apps sollten PasswordHasher verwenden. Weitere Informationen zu PasswordHasher finden Sie unter Exploring the ASP.NET Core Identity PasswordHasher (Erkunden von ASP.NET Core Identity PasswordHasher).

Die Codebasis für den Datenschutz enthält das NuGet-Paket Microsoft.AspNetCore.Cryptography.KeyDerivation, das wiederum Funktionen zum Ableiten von Kryptografieschlüsseln enthält. Dieses Paket ist eine eigenständige Komponente und weist keine Abhängigkeiten vom Rest des Datenschutzsystems auf. Es kann unabhängig verwendet werden. Die Quelle wurde aus Gründen der Benutzerfreundlichkeit zusätzlich zur Codebasis für den Datenschutz integriert.

Warnung

Der folgende Code zeigt die Verwendung von KeyDerivation.Pbkdf2 zum Generieren eines gemeinsam genutzten geheimen Schlüssels. Er sollte nicht zum Berechnen eines Hashs für ein Kennwort verwendet werden, das in einem Datenspeicher gespeichert wird.

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

Einen Anwendungsfall aus der Praxis finden Sie im Quellcode für den PasswordHasher-Typ von ASP.NET Core Identity.

Hinweis

Dokumentationslinks zur .NET-Referenzquelle laden in der Regel den Standardbranch des Repositorys, der die aktuelle Entwicklung für das nächste Release von .NET darstellt. Um ein Tag für ein bestimmtes Release auszuwählen, wählen Sie diesen mit der Dropdownliste Switch branches or tags (Branches oder Tags wechseln) aus. Weitere Informationen finden Sie unter How to select a version tag of ASP.NET Core source code (dotnet/AspNetCore.Docs #26205) (Auswählen eines Versionstags von ASP.NET Core-Quellcode (dotnet/AspNetCore.Docs #26205)).