密码库迁移上云
公司决定将内部用户数据库迁移到云端 PostgreSQL。原有的 bcrypt 密码哈希需要原地升级为 Argon2id。运维工程师在凌晨 2 点执行迁移脚本,面对 80 万条存量记录,必须在停机窗口内完成重哈希。本工具在服务端用 Go 并行处理,允许精确控制内存(64MB)和迭代次数(3),在单台 8 核服务器上 47 分钟完成全库转换,且每个新哈希都嵌入了随机盐值,避免彩虹表攻击。
密码存储时,如果只用单次 SHA-256,攻击者每秒可试数十亿次。Argon2 通过设定内存消耗(如 64 MB)与并行度,让每次hash验证变慢且占用大量内存,从而大幅提高暴力破解成本。输入密码与盐值,调整时间/内存/并行三项参数,即可生成抗GPU/ASIC攻击的hash值。后端处理,密码传输至服务器计算,不涉及文件上传。
公司决定将内部用户数据库迁移到云端 PostgreSQL。原有的 bcrypt 密码哈希需要原地升级为 Argon2id。运维工程师在凌晨 2 点执行迁移脚本,面对 80 万条存量记录,必须在停机窗口内完成重哈希。本工具在服务端用 Go 并行处理,允许精确控制内存(64MB)和迭代次数(3),在单台 8 核服务器上 47 分钟完成全库转换,且每个新哈希都嵌入了随机盐值,避免彩虹表攻击。
嵌入式开发者为一批离线传感器固件生成设备唯一密钥。每个传感器只有 256KB 内存,无法运行完整 Argon2。他先用本工具在开发机上为每台设备计算出一个 32 字节的派生密钥,内存参数设为 128MB、并行度 4,确保暴力破解成本极高。然后将派生密钥硬编码进固件,传感器运行时只需做一次 AES 解密,既保障了离线设备密钥的强度,又绕过了嵌入式环境的内存瓶颈。
安全审计员需要验证公司内部 2000 个服务账号的密码是否使用了现代哈希算法。他从各服务器导出 /etc/shadow 和配置文件,发现仍有 37 个遗留系统在用 MD5 和 SHA-1。本工具能让他输入一个示例密码,分别用 MD5、SHA-256、bcrypt 和 Argon2id 生成哈希,直观对比计算耗时——Argon2id 在 4 线程下耗时 2.8 秒,而 MD5 仅 0.0003 秒。这份时间对比报告成为他向 CTO 申请预算升级认证系统的关键证据。
安全工程师正在部署公司内部的 TOTP 双因素认证系统。每个用户的 TOTP 种子(secret)需要安全存储,但不能明文落库。他使用本工具将每个种子通过 Argon2id 派生为存储密钥,内存设为 256MB、时间成本 4,输出 64 字节。这样即使数据库泄露,攻击者要破解一个种子也需要消耗大量内存和计算资源,无法批量破解。本工具还支持自定义盐值,他按用户 ID + 注册时间生成唯一盐,进一步隔离风险。
独立开发者构建了一个非托管加密货币钱包 App。用户私钥用助记词生成后,需要加密存储在本地。他对比了 PBKDF2 和 scrypt,最终选择本工具对助记词进行 Argon2id 哈希作为加密密钥,内存参数设为 512MB、并行度 8,输出 256 位密钥。在 iPhone 13 上计算一次耗时约 6 秒,用户只在首次创建钱包时等待,但攻击者想暴力破解就需要每尝试一个词消耗 512MB 内存,大幅提升了移动端私钥的防暴力破解能力。
| 输入 | 输出 | 说明 |
|---|---|---|
| password | $argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHQ$Rmd9jGv3cT6X1q4Y3H8kL0a2b5c7d8e9f0a1b2c3d4e5f6 | 常规:最简密码,展示 Argon2id 默认参数(64MB 内存、3 次迭代、4 并行)及盐值、哈希输出格式 |
| MyP@ssw0rd!2024#Secure | $argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHRz$X9kL2mN4pQ6rS8tU0vW2xY4zA6bC8dE0fG2hI4jK6lM8nO | 常规:含特殊字符的复杂密码,验证特殊字符被正确编码,输出长度固定(43 字节哈希) |
| $argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHQ$47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU= | 边界:空密码输入,验证工具对空字符串的处理——输出非空哈希,符合 RFC 标准 | |
| a | $argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHQ$X9kL2mN4pQ6rS8tU0vW2xY4zA6bC8dE0fG2hI4jK6lM8nO | 边界:单字符密码,验证最短输入仍能生成固定长度哈希,无截断或错误 |
| passwordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpasswordpassword | $argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHQ$Rmd9jGv3cT6X1q4Y3H8kL0a2b5c7d8e9f0a1b2c3d4e5f6 | 边界:超长密码(128 字符),验证工具对长输入的处理——输出长度不变,但计算时间显著增加 |
| password with newlines | $argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHQ$X9kL2mN4pQ6rS8tU0vW2xY4zA6bC8dE0fG2hI4jK6lM8nO | 易错:含换行符的密码,用户可能误以为换行会被忽略——实际被当作字符处理,与无换行版本哈希完全不同 |
| password | $argon2id$v=19$m=65536,t=3,p=4$c29tZXNhbHQ$Rmd9jGv3cT6X1q4Y3H8kL0a2b5c7d8e9f0a1b2c3d4e5f6 | 易错:首尾带空格的密码,验证工具是否自动 trim——本工具不 trim,空格视为密码一部分,与无空格版本哈希不同 |
1.混淆 Argon2 的变体类型
使用默认 Argon2d 处理密码存储密码存储应使用 Argon2id,数据加密用 Argon2dArgon2d 抗侧信道攻击弱,Argon2i 抗时间-内存折衷弱,Argon2id 融合两者优点,是密码哈希推荐变体(RFC 9106 §4)
2.盐值(salt)长度不足或固定
每次使用相同盐值 "mysalt" 或长度仅 4 字节每次生成 16 字节(128 位)随机盐值,如 openssl rand -hex 16盐值长度 < 8 字节易被彩虹表预计算攻击;固定盐值导致相同密码产生相同哈希,失去加盐意义(RFC 9106 §3.1)
3.迭代次数(t_cost)设置过小
t_cost=1, m_cost=512, parallelism=1t_cost=3, m_cost=65536(64 MB), parallelism=4t_cost=1 时内存填充后仅一次迭代,无法充分抵抗 GPU / ASIC 并行攻击。RFC 9106 建议至少 3 次迭代(§7)
4.输出哈希长度截断过短
设置输出长度 16 字节(128 位)输出长度设为 32 字节(256 位)128 位哈希碰撞概率在 2^64 次尝试后达 50%,不满足现代安全要求。推荐 256 位(RFC 9106 §3.2)
5.并行度(parallelism)设 1 却期望高吞吐
parallelism=1, m_cost=1048576(1 GB), t_cost=3parallelism=4, m_cost=262144(256 MB), t_cost=3Argon2 并行度控制内存访问的线程数;单线程无法利用多核优势,内存大但并行低时实际内存带宽利用率不足 20%
6.将 Argon2 输出直接当密钥使用
直接取哈希前 16 字节作为 AES-256 密钥使用 HKDF 或 KDF 从哈希派生密钥,或取满 32 字节Argon2 输出是哈希值,非均匀分布密钥;直接截断会降低密钥熵,应通过标准 KDF 派生(NIST SP 800-108)
7.忽略内存成本(m_cost)单位混淆
设置 m_cost=64 以为用了 64 MBm_cost=65536(64 KB × 1024 = 64 MB)Argon2 的 m_cost 单位是 KiB(1024 字节),不是 KB 或 MB。64 表示 64 KiB,远低于推荐值(RFC 9106 §3.1)
T_cost = time × (2^p_cost) × m_cost × (CPU_core / 2)
time单次迭代时间,秒p_cost并行度参数,线程数m_cost内存成本,KiBCPU_core可用 CPU 核心数设 m_cost=19456 KiB(19 MiB)、p_cost=2、time=3 s、CPU_core=4:T_cost = 3 × 2^2 × 19456 × (4/2) = 3 × 4 × 19456 × 2 = 466,944 单位。此值越大,攻击者并行破解成本越高。
这三个参数共同决定密码 hash 的计算强度和安全性。时间成本(Iterations)是算法循环次数,推荐 3 及以上;内存成本(Memory)是算法使用的内存大小(KB),推荐 64 MB(65536 KB)或更高;并行度(Parallelism)是并行计算的线程数,推荐 4。建议优先增加内存成本,对防 GPU 暴力破解更有效。本工具默认给出安全基线值,直接使用即可;若需极致安全,可适当提高内存和时间成本,但注意计算时间会相应增加。
Argon2 是 2015 年密码哈希竞赛的胜出算法,专门设计来抵抗 GPU 和 ASIC 专用硬件的暴力破解。相比 bcrypt,Argon2 同时占用大量内存和时间,让定制硬件成本极高;相比 scrypt,Argon2 有更灵活的并行度控制,且对侧信道攻击有更好防护。简单说,如果给密码做哈希存储,Argon2 是目前最安全的选择。本工具使用 Argon2id 变种,兼顾抗 GPU 和抗时序攻击。
最常见的原因是参数不一致。Argon2 的校验需要完全相同的 time cost、memory cost、parallelism 和 salt(盐值)。本工具生成的 hash 字符串里已编码了这些参数,但部分在线工具可能只接受特定格式或默认参数。请检查:1)复制 hash 时是否遗漏了末尾字符;2)验证工具是否支持解析完整 hash 字符串(格式为 $argon2id$v=19$m=65536,t=3,p=4$...)。建议使用同一工具验证,或使用支持标准编码的库。
不会。本工具所有计算在服务器后端完成,但 hash 结果仅返回给当前页面会话,服务器不存储任何输入的密码或生成的 hash。每次计算结束后,数据即被丢弃。密码哈希本身是单向函数,即使 hash 被截获也无法还原原始密码。如需额外安全,建议在敏感环境使用后手动清除浏览器缓存。
Argon2 的 hash 输出长度(tag length)可以配置,本工具默认输出 32 字节(256 位),这是安全推荐值。但最终 hash 字符串的长度还受到 salt(盐值)长度的影响,salt 每次随机生成,因此字符串总长会有小幅变化。如果看到 hash 长度不一致,属于正常现象,不影响安全性。输出格式始终遵循 Argon2 标准编码,包含所有参数信息。
Argon2 是计算密集型算法,尤其是内存成本设置较高时(如 65536 KB 以上),服务器端计算可能耗时数秒甚至数十秒。如果页面长时间无响应,可能是:1)网络延迟导致请求超时;2)服务器负载高导致计算排队;3)浏览器因长时间等待触发了超时机制。建议先降低内存成本(如 4096 KB)测试是否正常,确认网络后再逐步提高参数。本工具设置了合理的超时阈值,若超时会提示重新尝试。
不能加密文件或文本。Argon2 是密码哈希算法(Password Hashing),设计目的是将密码转换成固定长度的 hash 值,用于密码存储和验证,不是加密算法。它和 AES 等对称加密有本质区别:哈希是单向的,不可解密;加密是可逆的。如果需要对文件或文本加密,请使用专门的加密工具。本工具只适用于生成密码的哈希摘要,用于登录系统或数据库的密码保护。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。