Encryption
Fernet 構造的安全性(wrt 非自定界令牌和 HMAC 短密鑰大小)
Fernet 被描述為“高級對稱加密配方”(來源
cryptography
),它似乎是python 庫中預設的高級加密方案。結構在這裡有完整的描述,它基本上需要一個消息 $ m $ 並產生如下令牌:
- 加密 $ m $ 通過 AES-CBC 即 $ IV \gets {0,1}^{128} $ , $ c = \text{AES-CBC}_{k1}(m, IV) $
- 獲取時間戳 $ t $ , 版本號 $ v $ 併計算 $ tag = \text{HMAC}_{k2}(v || t || IV || c) $
- 發送 $ token = v || t || IV || c || tag $ 給收件人
然後收件人將 $ token $ 並解密如下:
- 驗證 $ \text{HMAC}_{k2}(v || t || IV || c) $ == $ tag $
- 解密 $ c $ 通過 AES-CBC 即 $ m = \text{AES-CBC}_{k1}(c, IV) $ (當然只有標籤是正確的)
不包括密鑰交換,假設有兩個 128 位密鑰 $ k1, k2 $ 可以安全地建立。我的問題如下:
- 該規範指出
Fernet 令牌不是自定界的。假設傳輸將提供一種查找每個完整 fernet 令牌長度的方法。
這是否允許我們通過將數據添加到令牌的前面或末尾來以我們不應該能夠的方式篡改令牌?我的直覺說不,因為 HMAC 是在所有數據上計算的,並且組合是 Encrypt-then-MAC。
- 僅使用 128 位密鑰計算 HMAC(以 SHA256 作為底層雜湊函式)是否有任何危險?我的理解是,在這種情況下,標準密鑰大小為 256 位。
- 該規範指出
Fernet 令牌不是自定界的。假設傳輸將提供一種查找每個完整 fernet 令牌長度的方法。
這是否允許我們通過將數據添加到令牌的前面或末尾來以我們不應該能夠的方式篡改令牌?我的直覺說不,因為 HMAC 是在所有數據上計算的,並且組合是 Encrypt-then-MAC。
HMAC 不易受到長度擴展攻擊,並且從開頭添加前綴或刪除數據確實會導致不同的 HMAC(假設 HMAC 確實在數據的那部分之上)。
- 僅使用 128 位密鑰計算 HMAC(以 SHA256 作為底層雜湊函式)是否有任何危險?我的理解是,在這種情況下,標準密鑰大小為 256 位。
不,HMAC 具有驚人的彈性,並且已針對較小的密鑰大小進行了定義。256 位密鑰會給你(至少)256 位的安全性,但 128 位就足夠了。
請注意,此答案試圖直接回答給定的問題,而不是對 Fernet 進行全面審查。請注意,Fernet 到現在已經經歷了幾次修改;請檢查問題/答案是否仍然有效。