Authentication
PBKDF2 具有可變迭代計數是否是一個漏洞(用於消息身份驗證)?
**場景:**使用者點擊加密文件,並輸入他的密碼,以便使用 HMAC 對其進行解密和身份驗證(當其密鑰是使用 PBKDF2 派生時)。如果迭代計數是固定的,則認為它是安全的。
如果從文件中讀取迭代計數怎麼辦,它仍然安全嗎?我認為它是安全的,因為它的加密很好。但是它的認證呢?
我很難找到一個特定的漏洞,但是密鑰派生“算法”沒有完全固定(並且可以被攻擊者更改)這一事實似乎不安全。
不,在以下合理假設下,在密文(包括明文和未經身份驗證的)中傳遞的可變消息迭代計數(或更一般的工作因素參數)本身不是加密或身份驗證的漏洞:
- 對手只能獲取和操縱密文,並獲取明文(除了那些他/她試圖解密的人);不改變使用的程序,也不監視它們的執行。
- PBKDF2(或更一般的聲音熵拉伸函式)實現良好,用於將密碼和鹽轉換為寬對稱密鑰,然後用於對稱加密和消息身份驗證。在這裡,“執行良好”和“健全”包括:
- 對於可以從密文解析(並導致可承受的執行時間)的任何迭代計數(或更一般的工作因數參數),密碼拉伸函式對於不同密碼的衝突不會比隨機函式多得多。對於 PBKDF2,迭代計數為 0(或負數,如果編碼對此有規定)應被拒絕,如RFC2898 / PKCS#5 v2.0中所述
c iteration count, a positive integer
。接受迭代計數為 0 並在這種情況下提供恆定輸出(或僅取決於鹽)的假設實現將是脆弱的。
- 用於解密和身份驗證的程式碼對因迭代計數/工作因子參數的某些選擇而變得更糟的側通道攻擊不敏感。
- 沒有其他實現錯誤(或後門,可能偽裝成錯誤)可以觸髮變數工作因子的引入。
- 假設它們的寬密鑰具有足夠的熵,對稱加密和身份驗證原語是安全的。
論證(非正式證明):在密碼未知的情況下,驗證者實際使用的對稱密鑰中的熵仍然很高(接近密碼或受密鑰寬度限制,以較低者為準),包括在攻擊時工作因數已更改。對對手來說最好的攻擊仍然是找到密碼,並且隨著用於對手可以攔截並使用正確密碼加密或驗證的密文的工作因數而增加成本;其他密文(包括對手在不知道密碼的情況下可以建構的任何密文)無助於找到密碼。
主要的實際危險在於可變迭代計數引入的複雜性增加的後果:程式碼更複雜,因此更有可能包含未檢測到的弱點。