Argon2id 密码哈希算法
Argon2id 是目前密码哈希竞赛的冠军算法也是 NIST 推荐的密码存储标准。它结合了抗侧信道攻击和抗 GPU/ASIC 破解的特性是安全性最高的选择。在 .NET 生态中最推荐使用的库是Konscious.Security.Cryptography.Argon2。以下是完整的实战代码1. 安装 NuGet 包bashdotnet add package Konscious.Security.Cryptography.Argon22. 完整代码演示csharpusing Konscious.Security.Cryptography; using System; using System.Text; namespace Argon2Demo { class Program { static void Main(string[] args) { string plainPassword MySuperSecretPassword123!; Console.WriteLine( Argon2id 演示 ); TestArgon2id(plainPassword); } static void TestArgon2id(string password) { // 1. 生成随机盐 (推荐 16 字节) byte[] salt new byte[16]; Random.Shared.NextBytes(salt); // 2. 配置 Argon2id 参数并生成哈希 // 参数说明 // memorySize: 内存消耗 (KB)这里设为 64MB (65536 KB) // iterations: 迭代次数 (时间成本)设为 3 // degreeOfParallelism: 并行度 (线程数)设为 4 var argon2 new Argon2id(Encoding.UTF8.GetBytes(password)) { Salt salt, MemorySize 65536, Iterations 3, DegreeOfParallelism 4, HashSize 32 // 输出哈希长度 (字节) }; byte[] hashBytes argon2.GetBytes(); // 3. 将盐和哈希拼接后转为 Base64 以便存入数据库 byte[] combined new byte[salt.Length hashBytes.Length]; Buffer.BlockCopy(salt, 0, combined, 0, salt.Length); Buffer.BlockCopy(hashBytes, 0, combined, salt.Length, hashBytes.Length); string storedHash Convert.ToBase64String(combined); Console.WriteLine($Argon2id Hash (Base64): {storedHash}); // 4. 验证密码 // 从存储的 Base64 中还原出 Salt 和 Hash byte[] storedCombined Convert.FromBase64String(storedHash); byte[] storedSalt new byte[16]; byte[] storedHashValue new byte[32]; Buffer.BlockCopy(storedCombined, 0, storedSalt, 0, 16); Buffer.BlockCopy(storedCombined, 16, storedHashValue, 0, 32); // 使用相同的参数重新计算哈希 var verifyArgon2 new Argon2id(Encoding.UTF8.GetBytes(password)) { Salt storedSalt, MemorySize 65536, Iterations 3, DegreeOfParallelism 4, HashSize 32 }; byte[] verifyHashBytes verifyArgon2.GetBytes(); // 5. 使用恒定时间比较防止时序攻击 bool isValid CryptographicOperations.FixedTimeEquals(verifyHashBytes, storedHashValue); Console.WriteLine($验证正确密码: {isValid}); // True } } } Argon2id 核心参数调优指南Argon2id 的强大在于它的三个参数可以根据你的服务器硬件进行动态调整MemorySize内存成本这是 Argon2 的核心防御机制。建议至少设置为64MB (65536 KB)。内存越大黑客使用 GPU 或 ASIC 进行并行破解的成本就呈指数级上升。Iterations时间成本控制计算的迭代次数。通常设置为3即可。DegreeOfParallelism并行度使用的 CPU 核心数。建议设置为2 到 4。设置过高会导致单次登录请求占用过多 CPU在高并发下容易引发拒绝服务DoS。⚠️ 生产环境最佳实践手动拼接 Salt 和 Hash 容易出错。在实际项目中强烈建议你像之前封装 BCrypt 一样将 Argon2id 封装成一个IPasswordHasher服务并在appsettings.json中配置上述三个参数这样未来升级硬件时可以随时调整安全级别。