libsodium 為 AES-GCM 提供「is_available()」API,而不是 ChaCha-Poly AEAD 加密演算法的原因是,與 OpenSSL 不同,libsodium 不會公開 AES-GCM,除非您的處理器支援硬體加速的 AES 和 PCLMULQDQ 指令。
如果您想知道那是什麼意思:軟體 AES 容易受到快取時序漏洞的攻擊,因為它內部依賴於表格查詢:https://cr.yp.to/antiforgery/cachetiming-20050414.pdf (PDF)
GCM(稱為 GMAC 或 GHASH,取決於上下文)中的身份驗證步驟也存在類似的攻擊,它會洩漏 GHASH 金鑰(稱為 H),並且可以自由地用於執行選擇密文攻擊。
- 您可以在這裡了解有關 GCM 漏洞的更多資訊(在重用 nonce 而不是時序洩漏的情況下,但結果相同):https://www.youtube.com/watch?v=uxuXFK5XKEU
- 您可以在這裡了解有關 AES-GCM 的更多資訊:https://soatok.blog/2020/05/13/why-aes-gcm-sucks/
- 您可以在這裡了解它與其他加密模式的比較:https://soatok.blog/2020/07/12/comparison-of-symmetric-encryption-methods/
其他 AEAD 模式可以安全地在軟體中實現,而沒有側通道洩漏的風險。
重點是:AES-GCM 無法保證在所有硬體上都可用,因為如果沒有硬體支援,libsodium 將不會提供不安全的實作。
如果您想要保證在您無法控制的硬體上也可用的東西(您好,開源維護者),您的選擇是 ChaCha20-Poly1305 和 XChaCha20-Poly1305。
如果您可以控制硬體並明確需要 AES-GCM(注意:用於 FIPS 140-2 驗證),請隨意使用 AES-256-GCM。
<?php
function do_something(string $message, CryptoKeyObject $key): string {
if (!sodium_crypto_aead_aes256gcm_is_available()) {
throw new Exception("您的硬體上沒有 AES-256-GCM");
}
// ... 您的程式碼在這裡 ...
}
?>