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 PasswordHasher
programu , 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 rest 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).