Delen via


Hashwachtwoorden in ASP.NET Core

In dit artikel wordt beschreven hoe u de KeyDerivation.Pbkdf2 methode aanroept waarmee een wachtwoord kan worden gehasht met behulp van het PBKDF2-algoritme.

Waarschuwing

De KeyDerivation.Pbkdf2-API is een cryptografisch primitief op laag niveau en is bedoeld om apps te integreren in een bestaand protocol of cryptografisch systeem. KeyDerivation.Pbkdf2 mag niet worden gebruikt in nieuwe apps die aanmelding op basis van wachtwoorden ondersteunen en hash-wachtwoorden moeten opslaan in een gegevensarchief. Nieuwe apps moeten PasswordHashergebruiken. Voor meer informatie over PasswordHasher, zie Het verkennen van de ASP.NET Core Identity PasswordHasher.

De codebasis voor gegevensbeveiliging bevat een NuGet-pakket Microsoft.AspNetCore.Cryptography.KeyDerivation die cryptografische sleutelderivatiefuncties bevat. Dit pakket is een zelfstandig onderdeel en heeft geen afhankelijkheden van de rest van het systeem voor gegevensbeveiliging. Het kan onafhankelijk worden gebruikt. De bron bestaat naast de codebasis voor gegevensbeveiliging voor het gemak.

Waarschuwing

De volgende code laat zien hoe u KeyDerivation.Pbkdf2 gebruikt om een gedeelde geheime sleutel te genereren. Het mag niet worden gebruikt om een wachtwoord te hashen voor opslag in een gegevensarchief.

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

Zie de broncode voor ASP.NET Core IdentityPasswordHasher type voor een praktijkgebruiksscenario.

Notitie

Documentatiekoppelingen naar .NET-referentiebron laden meestal de standaardbranch van de opslagplaats, die de huidige ontwikkeling vertegenwoordigt voor de volgende release van .NET. Als u een tag voor een specifieke release wilt selecteren, gebruikt u de Switch-vertakkingen of tags vervolgkeuzelijst. Zie Een versietag selecteren van ASP.NET Core-broncode (dotnet/AspNetCore.Docs #26205)voor meer informatie.