自 Colin Percival 2009 年发布《密码学正确做法》以来,这一传统经 Thomas Ptacek(2015)及 Latacora(2018、2024)延续至今。尽管此次更新看似仓促,但行业格局已发生剧变:后量子密码学过渡的时间线在 2026 年初出现戏剧性转折,业界共识要求该过渡必须在 2029 年前完成。

好消息是,对称加密因 Grover 算法不构成实质威胁而依然安全;坏消息是,非对称加密的建议较 2018 年甚至 2024 年已发生根本性变化。此外,2026 年的另一重大变量是大型语言模型(LLM),"获取你能负担得起的最佳模型的代码审查"已正式与"使用内存安全语言"并列,成为新的密码学最佳实践。

以下建议假设不受特定合规体系限制(大多兼容 FIPS 140)。若需遵循 CNSA 2.0 等更严格规范,请相应替换。

速查表

  • 数据加密:云端使用 KMS;本地使用带随机 Nonce 的 XAES-256-GCM 或 XChaCha20-Poly1305;超过几 MB 的数据使用 Cobblestone-128。
  • 对称密钥长度:首选 256 位。
  • 对称“签名”:HMAC-SHA-256。
  • 哈希算法:SHA-2 仍可用;多哈希场景使用 SequenceHash。
  • 随机 ID:32 个随机字节(256 位)。
  • 密码处理:Argon2id 或 scrypt;强烈建议迁移至 Passkeys(通行密钥)。
  • 密钥交换:在标准协议中使用 X25519+ML-KEM-768。
  • 非对称加密:HPKE(采用 MLKEM768-X25519/X-Wing、HKDF-SHA256、AES-128-GCM)或带 PQ 密钥的 age。
  • 非对称签名:ML-DSA-44。
  • 应用安全:云端使用 ALB/NLB;本地使用 rustls、Go crypto/tls、BoringSSL、AWS-LC 或 s2n-tls,配合更新的 ACME 客户端。
  • 在线备份:restic 配合长随机密码。

数据加密

云端环境首选 KMS。本地加密需采用 AEAD 方案以规避 Nonce 管理风险,推荐 XAES-256-GCM 或 XChaCha20-Poly1305,并配合至少 128 位的随机 Nonce。对于超过几 MB 的大消息,严禁直接传递给 AEAD 或使用未认证流密码,应使用 STREAM 构造。推荐 Cobblestone-128(一种源自 TLS 的 STREAM 变体),其已在 pyca/cryptography 中可用,并将纳入 Go 标准库。

避免:未认证模式(CBC、CTR、原始流密码)、自行构建 AEAD、在未计算消息数量限制时使用随机 96 位 Nonce。

对称密钥长度

不必焦虑,首选 256 位。虽然 Grover 算法威胁有限且不存在 128 位暴力攻击,但 256 位密钥可有效排除多目标攻击。无需为此更改 TLS 库默认密码套件,AES-256 的性能损耗在实践中通常可忽略。

避免:非 128/256 位长度、不均匀密钥(如直接使用密码或 ASCII 十六进制字符串)。

对称“签名”

坚持使用 HMAC-SHA-256。务必通过验证原始字节串来规避规范化器和解析器对齐漏洞,即先检查 HMAC,再处理内部数据。若底层哈希可用,也可选择 KMAC 或键控 BLAKE3。

避免:自行构建 MAC、加密哈希、独立单次 MAC(如 Poly1305 或 GMAC)。

哈希算法

SHA-2 仍然可靠。优选 SHA-512/256 以抵御长度扩展攻击,SHA-256 和 SHA-512 亦可接受。SHA-3 非必要且较慢,但若已因 ML-KEM/ML-DSA 引入 Keccak,可从 SHAKE128 提取 32 字节。多哈希场景(如同时哈希文件名和内容)请使用 SequenceHash(基于 SHA-2)或 TupleHash(基于 SHA-3)。

避免:SHA-1、MD5、自行构建多哈希、截断至少于 256 位。

随机 ID

使用 32 个随机字节(256 位)。UUIDv4 等 API 仅提供约 128 位熵,仅在唯一值需求低于 2⁴⁸ 时适用。应调用操作系统 CSPRNG(如 Linux getrandom、Windows ProcessPrng)。

避免:非密码学 PRNG、用户空间随机数生成器(如 OpenSSL、haveged、CPU 抖动熵)。

密码处理

推荐 Argon2id 或 scrypt。Argon2id 参数建议为 m=64 MiB, t=2, p=1;scrypt 为 N=2^16, r=8, p=1。鉴于 bcrypt 的 72 字节截断限制,已不再推荐。

更重要的是,应评估是否可迁移至防钓鱼的 Passkeys,或以电子邮件魔术链接、OIDC SSO 作为替代。需注意,2026 年的 Passkeys 尚不具备后量子安全性,但仍能有效防御钓鱼和凭证填充。

避免:普通哈希、过度关注密码哈希而忽视 Passkeys 迁移、可钓鱼的电子邮件登录变体。

密钥交换

在安全、标准的协议中使用 X25519+ML-KEM-768。切勿自行构建密钥交换协议,应在 TLS 中选择 X25519MLKEM768,在 SSH 中选择 mlkem768x25519-sha256,或在 HPKE/age 中使用 MLKEM768-X25519。纯 ML-KEM-768 也是可行选项,但混合方案成本极低且更为常见。

避免:名称中不包含 ML-KEM 或 X-Wing 的任何方案。

非对称加密

采用 HPKE(配置为 MLKEM768-X25519/X-Wing、HKDF-SHA256、AES-128-GCM)或支持新 age1pq 前缀密钥的 age。HPKE 已成为混合加密的标准,尽管相关 PQ KEMs 仍处于草案阶段,但线路格式已稳定。大消息需进行分块处理。

避免:任何非 ML-KEM 基础方案(特别是 RSA 和 NaCl box)、OpenPGP、加密电子邮件。

非对称签名

直接使用 ML-DSA-44。若消息需预哈希,使用“外部-μ (Mu)”签名而非 HashML-DSA。ML-DSA-44 属于 NIST 类别 2,提供高于 128 位的安全余量。混合签名复杂性高且收益有限,除非在 SSH 等特定场景(OpenSSH 10.6 采用 ssh-mldsa44-ed25519),否则应避免复合签名。

鉴于非对称签名成本上升,应尽量避免使用,考虑以 HMAC 或随机会话令牌替代 JWT 签名。

避免:所有非 PQ 选项(RSA/ECDSA/Ed25519)、状态签名(LMS/XMSS)、HashML-DSA、复合签名、OpenPGP。

网站或客户端-服务器应用安全

云端环境使用云服务商的 ALB/NLB。本地部署推荐内存安全的 rustls 或 Go crypto/tls;若需 C 语言库,选择维护良好的 BoringSSL、AWS-LC 或 s2n-tls。确保 TLS 堆栈优先支持 X25519MLKEM768(需 TLS 1.3)。证书管理方面,网站应使用流行且更新的 ACME 客户端,内部应用可考虑自建 ML-DSA-44 X.509 证书。

避免:OpenSSL(因其一致性选择存在问题)、GnuTLS、Mbed TLS、wolfSSL、Botan 等存在已知严重漏洞的库,以及 TLS 1.2 及以下版本。

在线备份

使用 restic 配合长随机密码。restic 采用完全对称加密,不受量子计算机威胁。相比之下,Tarsnap 的非对称加密层基于 RSA,在量子计算面前存在潜在风险,尽管其当前架构在一定程度上缓解了低权限密钥泄露问题,但长期来看已不再推荐。