FreeBSD pkg 2.8.0 發布後將逐步淘汰 SHA-256 並改用 Blake2b 作為校驗和(針對量子計算的對策?)
你好,我是无能。
在 Github 的时间轴上看到 freebsd/pkg 的 Release 时,偶然瞥见了 Blake2b 这几个字。
https://github.com/freebsd/pkg/releases#release-2.8.0
- Blake2b used everywhere possible for checksums; repositories use blake2 instead of sha256
其实 Blake2b 本身在 2016 年就已经被包含在 GNU coreutils 的发布中了。
Blake2b 究竟是什么
之前只是稍微查了一下,只知道它是哈希算法的一种,所以简单确认了一下。
尝试用 Rust 实现 Blake2(Blake2b) #Security - Qiita
Blake2 有两种,分别是普通版的 Blake2b 和精简版的 Blake2s。Blake2b 用于 64 位系统,而 Blake2s 用于 8~32 位系统。
原来如此。
RFC:
RFC 7693 - The BLAKE2 Cryptographic Hash and Message Authentication Code (MAC)
它也是 Argon2 密码哈希中使用的算法。关于未来的替换趋势,是否会变成:密码哈希将目前使用 bcrypt 的实现替换为 Argon2,而加密哈希将目前使用 SHA-256 的实现替换为 Blake2,从而成为一种现代化的设计呢?
考虑到目前已经能看到不少实现开始进行相应的替换,尤其是使用 Argon2 的实现,我觉得这并非不可能。话虽如此,像 md5sum 这样作为轻量级高速哈希的工具至今仍在使用,在进行简单的完整性校验时非常方便。甚至 WebSocket 在 WebSocket 握手中也是基于使用 SHA-1 的前提写在 RFC 中的,但对于 WS 的实现来说,根本没有更改的必要,因此文档中也对此进行了说明。
本文件中描述的 WebSocket 握手并不依赖于 SHA-1 的安全属性(如抗碰撞性或对二次原像攻击的抵抗力等)(如 [RFC4270] 中所述)。
RFC 6455 - The WebSocket Protocol
既然可以就这个问题进行探讨,我就问了 ChatGPT (GPT 5.6)。
结论是,向 Argon2 迁移作为现代化手段是合适的,但作为加密哈希,感觉只是多了一种选择。
不过,FreeBSD 切换了 pkg 的 checksum 使用方式确实让我感到相当惊讶,所以这在未来是否会成为一种相当标准的操作呢?
以下是对 GPT 5.6 的提问
Q. 密码哈希将目前使用 bcrypt 的实现替换为 Argon2,而加密哈希将目前使用 SHA-256 的实现替换为 Blake2,这会成为一种现代化的设计吗?
A. 是的,对于密码存储而言,bcrypt → Argon2id 可以说是相当“现代化”的。另一方面,通用加密哈希从 SHA-256 → BLAKE2 并不一定是一种简单的时代更替。
如果是密码的话,目前大致的优先级如下:
| 用途 | 传统 | 当前推荐 |
|---|---|---|
| 密码存储 | bcrypt | Argon2id |
| 密码存储的替代 | PBKDF2 / scrypt | Argon2id / scrypt |
| 通用哈希 | SHA-256 | SHA-256 / SHA-3 / BLAKE2 / BLAKE3 |
| MAC | HMAC-SHA256 | HMAC-SHA256 / keyed BLAKE2 |
| 高速完整性校验 | SHA-256 | BLAKE2 / BLAKE3 |
OWASP 也将 Argon2id 作为新系统的首选,而将 bcrypt 主要定位为面向现有系统。Argon2id 不仅考虑 CPU 负载,还是将内存使用量纳入攻击成本的 memory-hard KDF,因此在设计上比 bcrypt 更能抵御使用 GPU/ASIC 进行大量尝试的密码破解。(OWASP Cheat Sheet Series)
例如,如果是新实现,
password
↓
Argon2id(
salt = random 128bit,
memory = 64 MiB,
iterations = 3,
parallelism = 适当值
)
↓
$argon2id$v=19$m=65536,t=3,p=...
这样的结构是很自然的。RFC 9106 也推荐使用 Argon2id。(RFC 编辑器)
另一方面,
SHA-256 → BLAKE2
则有所不同。
并不是因为 SHA-256 过时或变得危险了。
目前尚未发现针对 SHA-256 的实用碰撞攻击或原像攻击,在普通的加密用途中,它依然足够强大。
BLAKE2 的优点主要在于:
高速
+
安全性高
+
标准支持 keyed hashing
+
易于实现
因此,
旧式 现代化
bcrypt ───────→ Argon2id
↑相當明確
SHA-256 ───────→ BLAKE2
↑
不一定是替換
這樣的理解比較接近。
反過來說,在目前的設計中,
Password
└─ Argon2id
Cryptographic digest
├─ SHA-256
├─ SHA-3
├─ BLAKE2
└─ BLAKE3
Message authentication
├─ HMAC-SHA256
└─ keyed BLAKE2
像這樣根據用途進行選擇才是現代的做法。
特別是在自行設計的新軟體中,如果沒有協定相容性等限制,我認為
Password hashing
→ Argon2id
一般高速雜湊
→ BLAKE2b / BLAKE3
重視與外部標準・協定的相容性
→ SHA-256
MAC
→ HMAC-SHA256
或 keyed BLAKE2
這樣的思考方式比較好。
此外,BLAKE2 和 BLAKE3 非常重要。如果新設計的目的是「想使用比 SHA-256 更新的高速雜湊」,那麼在 2026 年,不僅是 BLAKE2,也應該將 BLAKE3 納入考量。BLAKE3 在並行化、SIMD 以及處理大型資料雜湊時速度非常快。
不過,
SHA-256 → BLAKE3
與其說是「為了安全性而捨棄 SHA-256」,不如說是
為了追求效能與 API 設計上的優勢所做的選擇
。
也就是說,問題中的兩者並非同等性質,
bcrypt → Argon2id
作為安全性設計,明確朝向現代化發展的方向。
SHA-256 → BLAKE2/BLAKE3
並非安全性必須的遷移,而是基於新設計中對效能與易用性的考量所做的選擇方向。
兩者存在這樣的差異。
如果將範圍擴大到「若要在 2026 年從零開始設計包含認證、簽章、加密、檔案雜湊在內的 API,該選擇什麼」,那麼以 Argon2id / BLAKE3 / XChaCha20-Poly1305 / Ed25519 / X25519 為核心,將會是一個相當現代化的架構。