在 ASP.NET Core中的哈希密码Hash passwords in ASP.NET Core
本文内容
数据保护基本代码包括一个包含加密密钥派生函数的AspNetCore 密钥派生。此包是一个独立的组件,与数据保护系统的其余部分没有任何依赖关系。它可以完全独立地使用。为了方便起见,源与数据保护代码库并存。
包当前提供了一个允许使用PBKDF2 算法对密码进行哈希处理 KeyDerivation.Pbkdf2
方法。此 API 与 .NET Framework 现有的Rfc2898DeriveBytes 类型非常相似,但有三个重要的区别:
KeyDerivation.Pbkdf2
方法支持使用多个 PRFs (当前HMACSHA1
、HMACSHA256
和HMACSHA512
),而Rfc2898DeriveBytes
类型仅支持HMACSHA1
。KeyDerivation.Pbkdf2
方法将检测当前操作系统,并尝试选择最适合的例程实现,在某些情况下提供更好的性能。(在 Windows 8 中,它提供Rfc2898DeriveBytes
吞吐量的10倍。)KeyDerivation.Pbkdf2
方法要求调用方指定所有参数(salt、PRF 和迭代计数)。Rfc2898DeriveBytes
类型为这些值提供默认值。
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 secure PRNG
byte[] salt = new byte[128 / 8];
using (var rng = RandomNumberGenerator.Create())
{
rng.GetBytes(salt);
}
Console.WriteLine($"Salt: {Convert.ToBase64String(salt)}");
// derive a 256-bit subkey (use HMACSHA1 with 10,000 iterations)
string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
password: password,
salt: salt,
prf: KeyDerivationPrf.HMACSHA1,
iterationCount: 10000,
numBytesRequested: 256 / 8));
Console.WriteLine($"Hashed: {hashed}");
}
}
/*
* SAMPLE OUTPUT
*
* Enter a password: Xtw9NMgx
* Salt: NZsP6NnmfBuYeJrrAKNuVQ==
* Hashed: /OOoOer10+tGwTRDTrQSoeCxVTFr6dtYly7d0cPxIak=
*/
有关实际用例,请参阅 ASP.NET Core 标识的 PasswordHasher
类型的源代码。