m=19456 是内存开销(KiB,即 19 MiB),t=2 是迭代次数,p=1 是并行度。
Argon2 密码哈希生成与校验工具,分为两个面板:
$argon2id$v=19$m=19456,t=2,p=1$c29tZXNhbHQ$RdescudvJCsgt3ub+b+dWRWJTmaaJObG。所有计算都在浏览器本机完成,密码与哈希值都不会上传到服务器。
argon2id(推荐);参数可用一键预设:- OWASP 建议:m=19 MiB,t=2,p=1 - RFC 9106 高配:m=2 GiB,t=1,p=4(浏览器内存可能不足,会计算失败)
Argon2 是 2015 年密码哈希竞赛(Password Hashing Competition, PHC)的获胜算法,由 Alex Biryukov、Daniel Dinu、Dmitry Khovratovich 设计,2017 年由 IETF 发布为 RFC 9106。
| 项目 | 说明 |
|---|---|
| 发布时间 | 2015(PHC 冠军),RFC 9106(2017) |
| 设计者 | Biryukov、Dinu、Khovratovich |
| 结构 | 基于 Blake2b 的填充内存块压缩函数 |
| 版本 | v=19(0x13),当前标准版本 |
| 盐长度 | 建议 16 字节(最少 8 字节) |
| 是否可逆 | 不可逆 |
| 抗 GPU | 强,通过可调内存开销实现 |
| 类型 | 内存访问方式 | 抗侧信道 | 适用场景 |
|---|---|---|---|
| argon2d | 数据相关(Data-dependent) | 弱 | 抗 GPU 最强,但存在侧信道风险,不建议用于服务端 |
| argon2i | 数据无关(Data-independent) | 强 | 适合存在侧信道威胁的环境,抗 GPU 稍弱 |
| argon2id | 混合(前半数据无关,后半数据相关) | 较强 | 推荐默认值,兼顾抗侧信道与抗 GPU |
OWASP 与 RFC 9106 都推荐把 argon2id 作为默认选择。
Argon2 有三个可调维度,这是它比 Bcrypt 更强的地方:
| 参数 | 含义 | 作用 |
|---|---|---|
m(memorySize) | 内存开销,单位 KiB | 抗 GPU / ASIC 的关键。强制每次计算占用大量内存,让并行破解受限 |
t(iterations) | 迭代次数(时间开销) | 增加计算轮数,抬高单次成本 |
p(parallelism) | 并行度(线程数) | 决定可用的并行通道数,不影响总内存开销 |
l(hashLength) | 输出长度,单位字节 | 通常 32 字节(256 位)足够 |
推荐配置:
| 来源 | m | t | p | 说明 |
|---|---|---|---|---|
| OWASP(2024) | 19456(19 MiB) | 2 | 1 | 通用推荐,本工具默认值 |
| RFC 9106 第一推荐 | 2097152(2 GiB) | 1 | 4 | 高安全场景 |
| RFC 9106 第二推荐 | 65536(64 MiB) | 3 | 4 | 折中方案 |
| 低内存环境 | 47104(46 MiB) | 1 | 1 | 资源受限时 |
选择原则与 Bcrypt 相同:让单次校验耗时落在 100 – 500 毫秒之间。如果服务器内存紧张,宁可降低 m 并提高 t,也不要让 m 低到失去抗 GPU 的意义(低于 8 MiB 基本失去内存硬化优势)。
以 $argon2id$v=19$m=19456,t=2,p=1$c29tZXNhbHQ$RdescudvJCsgt3ub+b+dWRWJTmaaJObG 为例:
| 片段 | 含义 |
|---|---|
$argon2id$ | 算法变体 |
v=19 | 版本号(0x13 = 19) |
m=19456,t=2,p=1 | 内存 KiB、迭代次数、并行度 |
c29tZXNhbHQ | 盐值的 Base64(无填充) |
RdescudvJCsgt3ub+b+dWRWJTmaaJObG | 摘要的 Base64(无填充) |
因为参数与盐值都写在串里,校验时不需要再填任何参数。
| 维度 | PBKDF2 | Bcrypt | Argon2 |
|---|---|---|---|
| 发布年份 | 2000 | 1999 | 2015 |
| 抵抗 GPU | 弱(只消耗 CPU 时间) | 一般 | 强(可调内存) |
| 抵抗 ASIC | 弱 | 弱 | 强 |
| 参数维度 | 1(迭代次数) | 1(cost) | 3(m / t / p) |
| 标准化 | RFC 8018、NIST | 事实标准 | RFC 9106 |
| FIPS 合规 | 是 | 否 | 否 |
| 推荐度 | 兼容性优先时 | 存量系统 | 新项目首选 |
Argon2 能用来加密文件吗?
浏览器里算 Argon2 会不会很慢?
为什么 argon2id 编码串里会有 v=19?
密码和哈希值会被上传到服务器吗?
Argon2 符合 FIPS 合规要求吗?
Argon2 和 Bcrypt 该选哪个?
校验时为什么不需要填参数?
Argon2 的哈希串为什么每次都不一样?
内存参数 m 设得越大越安全吗?
推荐的参数是多少?
argon2id、argon2i、argon2d 该选哪个?
Argon2 是什么?