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 rest sistem perlindungan data. 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).
ASP.NET Core