Kata sandi hash di ASP.NET Core

Artikel ini menunjukkan cara memanggil KeyDerivation.Pbkdf2 metode yang memungkinkan hash kata sandi menggunakan algoritma PBKDF2.

Peringatan

KeyDerivation.Pbkdf2 API adalah primitif kriptografi tingkat rendah dan dimaksudkan untuk digunakan untuk mengintegrasikan aplikasi ke dalam protokol atau sistem kriptografi yang ada. KeyDerivation.Pbkdf2 tidak boleh digunakan di aplikasi baru yang mendukung login berbasis kata sandi dan perlu menyimpan kata sandi yang di-hash di datastore. Aplikasi baru harus menggunakan PasswordHasher. Untuk informasi selengkapnya tentang PasswordHasher, lihat Menjelajahi ASP.NET Core Identity PasswordHasher.

Basis kode perlindungan data mencakup paket NuGet Microsoft.AspNetCore.Cryptography.KeyDerivation yang berisi fungsi derivasi kunci kriptografi. Paket ini adalah komponen mandiri dan tidak memiliki dependensi pada sistem perlindungan data lainnya. Ini dapat digunakan secara independen. Sumber ada bersama basis kode perlindungan data sebagai kenyamanan.

Peringatan

Kode berikut menunjukkan cara menggunakan KeyDerivation.Pbkdf2 untuk menghasilkan kunci rahasia bersama. Ini tidak boleh digunakan untuk hash kata sandi untuk penyimpanan di datastore.

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

Lihat kode sumber untuk jenis ASP.NET Core IdentityPasswordHasher untuk kasus penggunaan dunia nyata.

Catatan

Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).