encrypt-then-MAC 如何防止 CCA?
我是一名應用程序開發人員,實施客戶端加密以保護隨後傳輸以儲存在伺服器上的數據。該應用程序使用帶有 CBC 模式的 AES,並使用生成的 encrypt-then-mac HMAC 進行身份驗證。
該過程如下所示:
key_material = kdf(password, salt) mac_key = first_half(key_material) enc_key = second_half(key_material) iv = random_bits() ct = aes_cbc(plaintext, iv, enc_key) mac = hmac_sha256(ct, iv, mac_key)
這會產生一個
ct
,iv
,mac
然後將其傳輸到伺服器。然後,每次應用程序啟動(並且使用者輸入他們的password
)時,伺服器將該資訊傳遞回客戶端,然後整個過程被反轉以進行解密。
- 驗證
mac
。如果驗證失敗,則錯誤中止。- 解密
plaintext
為enc_key
,iv
和ct
.我了解需要
mac
在應用程序繼續解密plaintext
以顯示給使用者之前驗證消息的真實性。但是,我無法理解身份驗證如何防止其他任何事情。我已經讀過身份驗證將防止諸如選擇密文攻擊(CCA)之類的事情。我對 CCA 攻擊的理解是:
一類攻擊,攻擊者以特定方式修改加密流量,並可能通過觀察解密失敗的方式來學習明文。
如果攻擊者獲得了對儲存的
ct
,的訪問權iv
,mac
那麼他們是否擁有“觀察解密如何失敗”所需的一切?據我了解,
mac
驗證是一種應用程序實現。攻擊者不一定要使用我的應用程序來觀察解密是如何失敗的。他們可以只編寫自己的不進行mac
檢查的應用程序(或者只是修改我的開源應用程序並刪除mac
檢查)。我在這裡錯過了什麼嗎?身份驗證(更具體地說是 encrypt-then-mac)如何防止像 CCA 這樣的攻擊?
什麼CCA基本上意味著攻擊者提供他/她想要的任何密文進行解密並觀察系統的反應。此反應可用於推斷有關明文/密鑰的資訊。許多危險的攻擊都是基於更改密文中的某些位並觀察系統何時以及如何失敗。這通常足以部分或完全恢復明文或密鑰。經過身份驗證的加密(特別是 encrypt-then-mac 方法)基本上所做的是防止攻擊者能夠更改密文。這樣做需要重新計算mac,根據定義不能在不知道mac密鑰的情況下完成,否則由於mac不正確,解密會立即失敗,並且由於系統此時對明文一無所知,攻擊者可以’也不可能學到任何東西。
在這種情況下,攻擊者自己的應用程序毫無用處,因為沒有密鑰本身,任何解密失敗都只是指向一個且唯一明顯的原因——錯誤的密鑰。
我不明白你的意思,但我建議查看使用 MAC-then-encrypt 的 Padding Oracle 攻擊 SSL/TLS,即攻擊者可以通過使用 MAC 錯誤和 PAD 錯誤找出有關明文的內容。因為明文是 MACed,與 encrypt-then-mac 相反
但是,我個人會選擇 AES 計數器模式而不是 CBC。因為它在性能、無填充等方面具有一些優勢。