我是否需要擔心對私鑰進行 Base64 編碼/解碼時的定時攻擊?
我是否需要擔心對私鑰進行 Base64 編碼/解碼時的定時攻擊?這是一種常見操作(例如 PEM 鍵),並且在典型實現中是可變時間。
是的,有點。編碼確實取決於各個位,因此很可能存在時序差異。請注意,差異會很小;編碼一個字節可能比模冪運算快得多。但是由於即使是分組密碼也很容易受到攻擊,這很有可能,特別是因為可以實現表查找。
然而,該解決方案也是非常標準的:在儲存密鑰之前,您首先使用對稱密碼包裝密鑰。密鑰可以從強密碼中派生。大多數時候,當私鑰以 PEM 格式(這只是 ASCII 盔甲)儲存時,它們被編碼為 PKCS#12。作為包裝之後的編碼和之前的解碼,您應該可以防止針對 base 64 的時序攻擊。顯然,分組密碼更有可能受到時序攻擊的保護(但不要忘記驗證這一點)。
原則上 PKCS#8 也可以描述一個加密的私鑰,但似乎並沒有太多使用。PKCS#12 可用於加密私鑰並儲存公鑰/私鑰對的證書(鏈)。
如果您直接將它們儲存為 PKCS#1 或 PKCS#8 格式(不加密),您應該確保系統本身是安全的——尤其是在文件訪問方面。
是的,您確實需要擔心 Base64 編碼和解碼中的時間攻擊。一個簡單的實現要麼進行表查找(易受數據記憶體定時攻擊)或基於範圍的計算(易受分支預測和程式碼記憶體定時攻擊)。
洩漏很小,並且不會顯示完整的資訊(例如,屬於同一記憶體行的表條目可能完全無法區分)。但這可能會洩漏足夠多的密鑰材料來重建密鑰,尤其是對於私鑰具有大量冗餘資訊(私有指數和 CRT 參數)的 RSA 密鑰。Util::Lookup:利用Sieck 等人在密碼庫中的密鑰解碼。觀察了在理想條件下的一些常見實現,用於定時攻擊(從執行在同一處理器上的非安全作業系統攻擊安全飛地)並設法通過單次 Base64 解碼跟踪恢復 RSA 私鑰。
截至 2021 年年中,本文引導多個密碼庫切換到 Base64 編碼和解碼的恆定時間實現。但是,在我編寫時,有些仍然使用基於表的實現,尤其是 OpenSSL。
有幾種方法可以避免對私鑰和其他加密對象進行 Base64 解碼的時序側通道洩漏:
- 使用二進制 DER 編碼而不是 PEM 編碼。
- 使用恆定時間 Base64 實現。
- 使用 PKCS#8 或 PKCS#12 加密對 PEM 編碼的數據進行加密。如果加密密鑰與加密數據一起儲存,這不會提高靜態安全性,但它確實可以防止 Base64 解碼洩漏,因為任何洩漏只會洩露有關加密密鑰的不可利用資訊(假設解密過程本身不洩漏)。