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 PasswordHasher
finns 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).
ASP.NET Core