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,显著提升大规模并行攻击的成本。
  • 变体: Argon2dArgon2iArgon2id(推荐用于密码——混合方式)。
  • 可配置参数:
    • 内存大小 (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);
}

该库提供安全的默认设置,并自动处理盐的生成和编码。

对比

功能BCryptArgon2
内存使用量固定约 4 KB(非内存硬化)可配置,通常 32 MB–128 MB 以上
抗攻击性对 CPU 暴力攻击表现良好;对大规模 GPU 并行攻击较弱由于高内存需求,对 GPU、ASIC 以及并行攻击具有强大抵抗力
调优单一 cost 参数三个参数:内存、时间、线程
设计年代1999(基于 Blowfish)2015(专为密码哈希构建)

何时使用哪种

选择 BCrypt 的情形:

  • 维护已经依赖 BCrypt 的遗留系统。
  • 部署在内存极低的服务器上。
  • 简单性是主要考量。

选择 Argon2 的情形:

  • 构建新应用。
  • 处理高度敏感的用户数据。
  • 希望获得对当前及未来硬件攻击的最佳防护。

最佳实践

  • 在生产硬件上进行基准测试。 目标是每次验证耗时 400–800 ms
  • 在并发负载下测试内存消耗, 尤其是使用 Argon2 时。
  • 在下次成功登录时重新哈希密码, 以便在切换算法时平滑迁移。
  • 将密码哈希与 登录速率限制 结合使用,并在可能的情况下加入 多因素认证(2FA)
0 浏览
Back to Blog

相关文章

阅读更多 »

2026年企业 Web 开发终极指南

企业网页开发在过去十年中经历了巨大的演变。随着企业对数字平台的依赖日益增加,创建可扩展的、安全的、以及 h...

与过去的最后之舞🕺

介绍 你好 dev.to 社区!一周前,我发布了我的第一篇文章,介绍了自己,并解释说我离开了网页开发,专注于 cryptography……