数据保护基本代码包括一个包含加密密钥派生函数的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
标识的源代码。