在 ASP.NET Core中的哈希密码Hash passwords in ASP.NET Core

本文内容

数据保护基本代码包括一个包含加密密钥派生函数的AspNetCore 密钥派生此包是一个独立的组件,与数据保护系统的其余部分没有任何依赖关系。它可以完全独立地使用。为了方便起见,源与数据保护代码库并存。

包当前提供了一个允许使用PBKDF2 算法对密码进行哈希处理 KeyDerivation.Pbkdf2 方法。此 API 与 .NET Framework 现有的Rfc2898DeriveBytes 类型非常相似,但有三个重要的区别:

  • KeyDerivation.Pbkdf2 方法支持使用多个 PRFs (当前 HMACSHA1HMACSHA256HMACSHA512),而 Rfc2898DeriveBytes 类型仅支持 HMACSHA1

  • KeyDerivation.Pbkdf2 方法将检测当前操作系统,并尝试选择最适合的例程实现,在某些情况下提供更好的性能。(在 Windows 8 中,它提供 Rfc2898DeriveBytes吞吐量的10倍。)

  • KeyDerivation.Pbkdf2 方法要求调用方指定所有参数(salt、PRF 和迭代计数)。Rfc2898DeriveBytes 类型为这些值提供默认值。

  1. using System;
  2. using System.Security.Cryptography;
  3. using Microsoft.AspNetCore.Cryptography.KeyDerivation;
  4. public class Program
  5. {
  6. public static void Main(string[] args)
  7. {
  8. Console.Write("Enter a password: ");
  9. string password = Console.ReadLine();
  10. // generate a 128-bit salt using a secure PRNG
  11. byte[] salt = new byte[128 / 8];
  12. using (var rng = RandomNumberGenerator.Create())
  13. {
  14. rng.GetBytes(salt);
  15. }
  16. Console.WriteLine($"Salt: {Convert.ToBase64String(salt)}");
  17. // derive a 256-bit subkey (use HMACSHA1 with 10,000 iterations)
  18. string hashed = Convert.ToBase64String(KeyDerivation.Pbkdf2(
  19. password: password,
  20. salt: salt,
  21. prf: KeyDerivationPrf.HMACSHA1,
  22. iterationCount: 10000,
  23. numBytesRequested: 256 / 8));
  24. Console.WriteLine($"Hashed: {hashed}");
  25. }
  26. }
  27. /*
  28. * SAMPLE OUTPUT
  29. *
  30. * Enter a password: Xtw9NMgx
  31. * Salt: NZsP6NnmfBuYeJrrAKNuVQ==
  32. * Hashed: /OOoOer10+tGwTRDTrQSoeCxVTFr6dtYly7d0cPxIak=
  33. */

有关实际用例,请参阅 ASP.NET Core 标识的 PasswordHasher 类型的源代码