Udostępnij za pośrednictwem


Hasła skrótów w ASP.NET Core

W tym artykule pokazano, jak wywołać metodę KeyDerivation.Pbkdf2 umożliwiającą utworzenie skrótu hasła przy użyciu algorytmu PBKDF2.

Ostrzeżenie

Interfejs KeyDerivation.Pbkdf2 API jest niskim poziomem kryptograficznym pierwotnym i ma być używany do integrowania aplikacji z istniejącym protokołem lub systemem kryptograficznym. KeyDerivation.Pbkdf2 Nie należy używać w nowych aplikacjach, które obsługują logowanie oparte na hasłach i muszą przechowywać skróty haseł w magazynie danych. Nowe aplikacje powinny używać polecenia PasswordHasher. Aby uzyskać więcej informacji na temat PasswordHasherprogramu , zobacz Eksplorowanie ASP.NET Core Identity PasswordHasher.

Baza kodu ochrony danych zawiera pakiet NuGet Microsoft.AspNetCore.Cryptography.KeyDerivation zawierający funkcje wyprowadzania kluczy kryptograficznych. Ten pakiet jest składnikiem autonomicznym i nie ma zależności od reszty systemu ochrony danych. Można z nich korzystać osobno. Źródło istnieje wraz z bazą kodu ochrony danych jako wygodą.

Ostrzeżenie

Poniższy kod pokazuje, jak użyć KeyDerivation.Pbkdf2 polecenia w celu wygenerowania wspólnego klucza tajnego. Nie należy używać go do tworzenia skrótu hasła do przechowywania w magazynie danych.

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

Zobacz kod źródłowy dla typu ASP.NET Core IdentityPasswordHasher dla rzeczywistego przypadku użycia.

Uwaga

Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).