Dela via


Hash-lösenord i ASP.NET Core

Den här artikeln visar hur du anropar metoden KeyDerivation.Pbkdf2 som tillåter hashning av ett lösenord med hjälp av algoritmen PBKDF2.

Varning

KeyDerivation.Pbkdf2-API:et är en lågnivåkryptografisk primitiv och är avsedd att användas för att integrera appar i ett befintligt protokoll eller kryptografiskt system. KeyDerivation.Pbkdf2 ska inte användas i nya appar som stöder lösenordsbaserad inloggning och som behöver lagra hashade lösenord i ett datalager. Nya appar bör använda PasswordHasher. Mer information om PasswordHasherfinns i Exploring the ASP.NET Core Identity PasswordHasher.

Dataskyddskodbasen innehåller ett NuGet-paket Microsoft.AspNetCore.Cryptography.KeyDerivation som innehåller kryptografiska nyckelhärledningsfunktioner. Det här paketet är en fristående komponent och har inga beroenden för resten av dataskyddssystemet. Den kan användas oberoende. Källan finns tillsammans med dataskyddskodbasen för enkelhets skull.

Varning

Följande kod visar hur du använder KeyDerivation.Pbkdf2 för att generera en delad hemlig nyckel. Det ska inte användas för att hasha ett lösenord för att lagra i ett datalager.

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

Se källkoden för ASP.NET Core IdentityPasswordHasher typ för ett verkligt användningsfall.

Obs

Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik version använder du listrutan Växla grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).