Skip to content

按功能组织:哈希函数 → MAC/KDF → Merkle 结构 → 密码存储。

哈希函数

参考:FIPS 180-4 SHA · FIPS 202 SHA-3

安全性质

  • 抗原像:给定 h,难找 m 使 H(m)=h
  • 抗第二原像:给定 m,难找 m'≠m 使 H(m')=H(m)
  • 抗碰撞:难找任意 m≠m' 使 H(m)=H(m')

算法选型

算法输出构造状态
MD5128 bitMerkle-Damgård已破碰撞,禁止安全用途
SHA-1160 bitMerkle-Damgård已破碰撞,弃用
SHA-256/512256/512 bitMerkle-Damgård通用首选
SHA-3可变Sponge (Keccak)与 SHA-2 不同构造
<ul>
  <li><strong>生日攻击</strong>:n bit 输出约 2^{n/2} 次可找碰撞;输出长度不能省</li>
</ul>

MAC 与 KDF

参考:RFC 2104 HMAC · RFC 5869 HKDF · RFC 9106 Argon2

MAC

  • HMAC:H(K' ⊕ opad || H(K' ⊕ ipad || m));密钥化完整性校验
  • 勿用裸哈希 H(m||k)(长度扩展攻击)

KDF 选型

KDF输入场景
HKDF共享秘密 + salt + infoTLS 密钥派生、协议密钥拉伸
PBKDF2密码 + salt + 迭代旧标准密码存储
scrypt密码 + salt + 内存参数内存硬,抗 ASIC
Argon2id密码 + salt + 参数新系统首选(2015 PHC 冠军)

Merkle 结构

  • Merkle 树:叶子为数据哈希,内部节点为子节点拼接后哈希
  • Merkle 证明:O(log n) 证明某叶子在树中——轻节点验证
  • 证书透明度(CT):CA 签发日志,Merkle 树公开审计
  • 区块链:交易 Merkle 根写入区块头

参考:Certificate Transparency

练习:实现 Merkle 证明的生成与验证。

密码存储

参考:OWASP 密码存储备忘单

  • 存储的是密码的加盐哈希,不是加密(不可逆)
  • 每个用户独立随机盐;Argon2id 参数随硬件演进调整
  • 比较哈希用常量时间函数,防 timing 泄露
  • 域分离:不同用途的密钥用 HKDF info 区分

工程实践

语言库用途
Pythonhashlib、hmac.compare_digestSHA-256、常量时间比较
Pythonargon2-cffi密码存储
Rustsha2、hmac、hkdf、argon2哈希、MAC、KDF
Rustsubtle常量时间比较
<p class="kb-note-inline">练习:Argon2id 用户注册流程。</p>

WIZARD