返回

文章详情

(后量子)密码学的正确答案

Hacker News2026年10月12日 12:26

2026年10月12日,发布“密码学的正确答案”已成为开发者的传统。Colin Percival在2009年开始,Thomas Ptacek在2015年跟进,然后Latacora在2018年和2024年继续。这次更新可能感觉来得太快,但变化实在太多。后量子过渡的时间轴在2026年初发生了戏剧性的改变,现在达成共识,必须在2029年前完成。2029年!我们还有三年!好消息是,尽管你可能听说过一些,对称密码学会没问题,因为Grover不重要。坏消息是,所有非对称答案与2018年相比都有所改变,与2024年相比大多数答案也有变化。以下答案假设您不受任何特定合规制度的约束,尽管大多数与FIPS 140兼容。如果您需要遵循更严格的标准,比如CNSA 2.0,您会知道该如何替代。最后,请记住2026年的另一个重大变化:LLM现在在发现漏洞方面非常出色。“从您能负担得起的最佳模型那里获得审查”现在坚定地成为密码学的正确答案之一,此外还有长期经典的“使用内存安全语言”。如果您比较着急,这里是速查表:加密数据:如果您在云中,使用KMS。否则,使用XAES-256-GCM或XChaCha20Poly1305带有随机nonce。如果您加密的数据超过几MB,请使用Cobblestone-128。对称密钥长度:不要太纠结。如果需要选择,使用256位密钥。对称“签名”:HMAC-SHA-256。哈希算法:SHA-2仍然可以,但如果需要的话,使用真正的多重哈希(SequenceHash)。随机ID:32个随机字节,即256位随机数。密码处理:Argon2id或scrypt。但您是否考虑过使用密码钥匙呢?密钥交换:在安全的标准协议中使用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或与流行、更新的ACME客户端配合的s2n-tls。在线备份:使用restic和一个长的随机密码。现在让我们深入探讨。加密数据:如果您在云中,使用KMS。否则,使用XAES-256-GCM或XChaCha20Poly1305带有随机nonce。如果您加密的数据超过几MB,请使用Cobblestone-128。Percival,2009:使用HMAC的AES-CTR。Ptacek,2015:NaCl/libsodium默认,或ChaCha20Poly1305,或AES-GCM。Latacora,2018:KMS,或XSalsa20+Poly1305。Latacora,2024:KMS,或NaCl的secretbox,或XChaCha20Poly1305。Latacora对于何时以及何以使用云KMS的推理依然坚固,因此可以从这里开始。如果您在本地加密,您需要一种AEAD,以便您无需担心跟踪nonce或加密的消息数量,因此您希望使用至少128位的随机nonce。NaCl/libsodium的secretbox只是对一种不常见的AE构造(XSalsa20+Poly1305)包裹的薄薄一层,因此我推荐XAES-256-GCM或XChaCha20Poly1305。前者是标准KDF和AES-GCM的有效组合,被打包为扩展nonce AEAD,因此即使您的库没有以该名称提供,您也可以从KDF和AES-GCM API中组装它。常规的AES-GCM和ChaCha20Poly1305与随机nonce只有在您确信不会用一个密钥加密超过十亿条消息时才是可以的。如果您恰好到处都拥有AES-GCM-SIV,这也是一个不错的AEAD选择,但这可能不太可能。一些更新的选项具有良好的属性,比如密钥承诺,但目前还不普遍可用。由于您拥有AEAD,请考虑将上下文放入额外数据中,比如您正在加密的用户ID或协议的版本。任何您在解密时肯定会知道且不保密的信息都可以。如何处理大消息是非常重要的,而KMS不会为您解决这个问题。请勿将一条大消息传递给AEAD,否则您可能被迫在未在解密时进行身份验证之前处理或存储明文。绝对不要使用未经过身份验证的流密码。相反,您应该使用STREAM(这不是流密码,而是在流上使用AEAD的一种方法……我知道,我知道,名字糟糕)。有很多选项——实际上太多了,也没有一个是共识答案。Tink有一个,libsodium有一个,AWS加密SDK有一个,FLOE有一个,age也有一个,等等。我推荐Cobblestone-128,这是一种源自TLS的STREAM变体,已经在pyca/cryptography中可用,并将在Go标准库中很快提供(同时在filippo.io/cobblestone上获取)。避免:未经身份验证的模式(CBC,CTR,原始流密码),随机96位nonce,除非您花了很多时间考虑加密消息的数量,自行构造AEAD。对称密钥长度:不要太纠结。如果需要选择,使用256位密钥。Percival,2009:256位AES密钥。Ptacek,2015:256位

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

☕请我喝杯咖啡