Sdílet prostřednictvím


Hashovat hesla v ASP.NET Core

Tento článek ukazuje, jak volat metodu KeyDerivation.Pbkdf2 , která umožňuje hashování hesla pomocí algoritmu PBKDF2.

Upozorňující

Rozhraní KeyDerivation.Pbkdf2 API je primitivní kryptografická úroveň nízké úrovně a je určená k integraci aplikací do existujícího protokolu nebo kryptografického systému. KeyDerivation.Pbkdf2 by se nemělo používat v nových aplikacích, které podporují přihlášení založené na heslech a potřebují ukládat hesla hash v úložišti dat. Nové aplikace by měly používat PasswordHasher. Další informace najdete PasswordHasherv tématu Zkoumání ASP.NET Core Identity PasswordHasher.

Základ kódu ochrany dat zahrnuje balíček NuGet Microsoft.AspNetCore.Cryptography.KeyDerivation , který obsahuje funkce odvození kryptografických klíčů. Tento balíček je samostatná komponenta a nemá žádné závislosti na rest systému ochrany dat. Může být použit samostatně. Zdroj existuje vedle základu kódu ochrany dat jako pohodlí.

Upozorňující

Následující kód ukazuje, jak použít KeyDerivation.Pbkdf2 ke generování sdíleného tajného klíče. Nemělo by se používat k hashování hesla pro úložiště v úložišti dat.

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

V případě skutečného případu použití se podívejte na zdrojový kód pro typ ASP.NET CoreIdentityPasswordHasher.

Poznámka:

Odkazy na dokumentaci k referenčnímu zdroji .NET obvykle načítají výchozí větev úložiště, která představuje aktuální vývoj pro příští verzi .NET. Pokud chcete vybrat značku pro konkrétní verzi, použijte rozevírací seznam pro přepnutí větví nebo značek. Další informace najdete v tématu Jak vybrat značku verze zdrojového kódu ASP.NET Core (dotnet/AspNetCore.Docs #26205).