欺騙協議隨機數
艾米和貝蒂有一個共享密鑰 $ k $ , 下面的協議是為 Betty 和 Amy 提供相互認證。
- A 發送 B: $ n_a $
- B 發送 A : $ n_b ;|; E(k, n_a) $
- A 發送 B: $ E(k, n_b) $
在哪裡
- $ n_a $ 是來自 Amy 的隨機數
- $ n_b $ 是貝蒂的一個隨機數
即使不知道共享密鑰,也可以在有人假裝是 Amy 的情況下進行欺騙嗎?
是的,馬洛里可以通過多種方式假裝艾米。
一種明顯的方式,甚至不以任何方式涉及艾米本人,就是讓馬洛里正常執行協議的步驟 1 和 2,就好像他是艾米一樣。然後,鑑於貝蒂的隨機數 $ n_b $ , Mallory 可以啟動協議的第二個並行實例,再次偽裝成 Amy,然後送出 $ n_b $ 作為艾米的隨機數。貝蒂的回應然後包含 $ E(k, n_b) $ ,Mallory 可以將其發回給 Betty 以完成原始身份驗證協議:
- 中場(甲)→乙: $ n_a $ (= Mallory 選擇的任意 nonce,假裝是 Amy)
- 乙→中(甲): $ n_b ;|; E(k, n_a) $
二、平行會議:
1’。中場(甲)→乙: $ n_b $
2’。乙→中(甲): $ n_b’ ;|; E(k, n_b) $ 3. 中場(甲)→乙: $ E(k, n_b) $
當然,如果 Amy 也願意響應 Betty(或偽裝成她的 Mallory)發起的身份驗證嘗試,那麼 Mallory 可以使用 Amy 而不是 Betty 執行並行步驟 1’ 和 2’。因此,即使 Betty 足夠聰明地檢查她在步驟 1’ 中收到的 nonce 是否與她自己之前的 nonce 匹配(或者即使她只是一次拒絕參與多個身份驗證交換),她也無法檢測到這個版本的攻擊。
正如owlstead 所建議的那樣,擊敗這種攻擊的方法是消除第 2 步和第 3 步中發送的加密值的歧義,以便 Mallory 在第 3 步中無法使用來自第 2 步的值。一些可能的方法是:
在加密字元串中包含一個步驟編號,例如:
- 甲→乙: $ n_a $
- 乙→甲: $ n_b ;|; E(k, 2 ;|; n_a) $
- 甲→乙: $ E(k, 3 ;|; n_b) $
在每個加密字元串中包含兩個隨機數(以不同的順序),例如:
- 甲→乙: $ n_a $
- 乙→甲: $ n_b ;|; E(k, n_a ;|; n_b) $
- 甲→乙: $ E(k, n_b ;|; n_a) $
在加密字元串中包含(假定的)發送方和接收方的身份(注意:不能防止在步驟 1’ 和 2’ 中 Mallory 聯繫 Amy 而不是 Betty 的修改後的攻擊),例如:
- 甲→乙: $ n_a $
- 乙→甲: $ n_b ;|; E(k, id_b ;|; id_a ;|; n_a) $
- 甲→乙: $ E(k, id_a ;|; id_b ;|; n_b) $
以上所有,例如:
- 甲→乙: $ n_a $
- 乙→甲: $ n_b ;|; E(k, 2 ;|; id_a ;|; n_a ;|; id_b ;|; n_b) $
- 甲→乙: $ E(k, 3 ;|; id_b ;|; n_b ;|; id_a ;|; n_a) $
就個人而言,我會推薦最後一個選項,如果只是因為它使加密字元串自記錄: $ E(k, 3 ;|; id_b ;|; n_b ;|; id_a ;|; n_a) $ 可以讀作“艾米( $ id_a $ ) 使用 nonce 進行身份驗證 $ n_a $ 給貝蒂( $ id_b $ ) 隨機數 $ n_b $ 在第 3 步”,這正是消息應該傳達的內容。
此外,顯然,加密方法 $ E $ 需要是不可延展的,並且組合操作 $ | $ 不應引入任何歧義。事實上,呼叫 $ E $ “加密”在這裡有點誤導:該協議工作正常,即使 $ E(k,m) $ 只是一個MAC,但如果有明顯的攻擊 $ E $ 是一種可延展(但在語義上仍然安全)的加密方案,如CTR 模式加密,因為 Mallory 可以簡單地採用 $ E(k, n_a) $ 並將其變成 $ E(k, n_b) $ 通過翻轉適當的位。
所描述的協議還存在其他潛在問題,具體取決於它的使用方式。例如,如果馬洛里可以將自己作為 Amy 和 Betty 之間的中間人,那麼他可以簡單地將他從 Amy 收到的任何消息轉發給 Betty,反之亦然,從而輕鬆地說服兩人他們是在直接交談,儘管兩人實際上都在與馬洛里交談。從根本上說,如果沒有一些額外的帶外資訊,就無法在協議的身份驗證階段阻止這種攻擊:只要 Amy 和 Betty 只是從某個未指定的網路接收消息,他們就無法分辨出是誰他們經過的手。
唯一的解決方案是讓 Amy 和 Betty 使用共享密鑰加密他們的後續通信 $ k $ (或者,更好的是,從 $ k $ 和隨機數 $ n_a $ 和 $ n_b $ , 最好還有身份 $ id_a $ 和 $ id_b $ ) 使用安全的、不可延展的加密方案來確保即使馬洛里可以截獲他們的消息,他也無法解密或更改它們。(當然,消息還應該攜帶序列號/時間戳和發送者/接收者ID,以防止重放攻擊。)