BCrypt vs Argon2:.NET 中的密码哈希 – 实用深度剖析
发布: (2026年2月28日 GMT+8 12:41)
4 分钟阅读
原文: Dev.to
Source: Dev.to
概述
密码存储是 .NET 应用程序中的关键安全问题。快速的密码学哈希(例如 SHA‑256)不适用,因为攻击者可以使用 GPU 或 ASIC 每秒计算数十亿次猜测。专为密码设计的哈希算法故意慢,并为每个密码加入唯一的随机盐,使暴力破解和彩虹表攻击的成本变得极高。
BCrypt
BCrypt 于 1999 年推出,基于 Blowfish 加密算法。它使用一种经过修改的、耗时的密钥调度,并重复多次。
技术细节
- 内存使用量: 固定且低(约 4 KB 每个哈希)——不是内存硬化的。
- 成本参数: 单一的“工作因子”(例如
Cost = 13→ 2¹³ = 8 192 次迭代)。 - 性能: 完全依赖 CPU;现代 GPU 仍然可以相对廉价地并行计算大量 BCrypt 哈希。
安装
dotnet add package BCrypt.Net-Next
示例代码 (C#)
using BCrypt.Net;
public static class PasswordHasher
{
private const int WorkFactor = 13;
public static string Hash(string password)
=> BCrypt.Net.BCrypt.HashPassword(password, WorkFactor);
public static bool Verify(string password, string hash)
=> BCrypt.Net.BCrypt.Verify(password, hash);
}
Argon2
Argon2 在 2015 年赢得密码哈希竞赛,专为密码哈希从头设计。
技术细节
- 内存硬化: 强制攻击者为每次猜测分配大量 RAM,显著提升大规模并行攻击的成本。
- 变体:
Argon2d、Argon2i、Argon2id(推荐用于密码——混合方式)。 - 可配置参数:
- 内存大小 (
m) – 通常 32 MB–128 MB 以上。 - 迭代次数 (
t)。 - 并行度 (
p)。
- 内存大小 (
安装
dotnet add package Isopoh.Cryptography.Argon2
示例代码 (C#)
using Isopoh.Cryptography.Argon2;
public static class PasswordHasher
{
public static string Hash(string password)
=> Argon2.Hash(password);
public static bool Verify(string password, string hash)
=> Argon2.Verify(hash, password);
}
该库提供安全的默认设置,并自动处理盐的生成和编码。
对比
| 功能 | BCrypt | Argon2 |
|---|---|---|
| 内存使用量 | 固定约 4 KB(非内存硬化) | 可配置,通常 32 MB–128 MB 以上 |
| 抗攻击性 | 对 CPU 暴力攻击表现良好;对大规模 GPU 并行攻击较弱 | 由于高内存需求,对 GPU、ASIC 以及并行攻击具有强大抵抗力 |
| 调优 | 单一 cost 参数 | 三个参数:内存、时间、线程 |
| 设计年代 | 1999(基于 Blowfish) | 2015(专为密码哈希构建) |
何时使用哪种
选择 BCrypt 的情形:
- 维护已经依赖 BCrypt 的遗留系统。
- 部署在内存极低的服务器上。
- 简单性是主要考量。
选择 Argon2 的情形:
- 构建新应用。
- 处理高度敏感的用户数据。
- 希望获得对当前及未来硬件攻击的最佳防护。
最佳实践
- 在生产硬件上进行基准测试。 目标是每次验证耗时 400–800 ms。
- 在并发负载下测试内存消耗, 尤其是使用 Argon2 时。
- 在下次成功登录时重新哈希密码, 以便在切换算法时平滑迁移。
- 将密码哈希与 登录速率限制 结合使用,并在可能的情况下加入 多因素认证(2FA)。