設計一個簡單的質詢-響應對稱相互認證協議
我正在設計一個協議,兩個設備將使用該協議通過不可靠、不安全的通道進行相互身份驗證。系統必須是快速和低功耗的,因此對稱加密是一項要求。我正在考慮使用質詢-響應協議,但找不到提供相互身份驗證並使用密鑰而不是密碼的現有協議;所以我決定自己設計並徵求你的意見。
假設 Alice 和 Bob 是 2 方,他們各自的身份編碼為 $ id_A $ 和 $ id_B $ . 他們共享一個對稱密鑰 $ K $ 128 位或更多。注意:它是密鑰,而不是密碼。 $ n_A, n_B $ 是真正的隨機數。 $ hash $ 是一種安全的單向函式,沒有長度擴展漏洞,如 SHA3 或 HMAC-SHA256。
該協議的“簡單版本”將是這個:
- $ A \rightarrow B: id_A, n_A $ - - 挑戰
- $ B \rightarrow A: id_B, n_B, hash(K||n_A) $ — 響應和第二次挑戰
- $ A \rightarrow B: hash(K||n_B) $ — 第二個回應
我還有一個像下面這樣的“強化版本”,我在其中添加了更好的 MAC,在雜湊中的消息和硬編碼值(1、2 和 3)之間進行綁定,以強制執行消息順序和它們之間的差異。
- $ A \rightarrow B: id_A, n_A, hash(K||1||id_A||n_A) $ — 認證挑戰
- $ B \rightarrow A: id_B, n_B, hash(K||2||id_A||n_A||id_B||n_B) $ – 響應和經過身份驗證的第二個挑戰
- $ A \rightarrow B: hash(K||3||id_A||n_A||id_B||n_B) $ — 應對第二個挑戰
我的問題是:我應該使用哪一個?“簡單”夠嗎?“硬化”是否過度設計?有這種簡單程度的更好的協議嗎?
您可能想使用 HMAC 而不是任何散列函式。我將使用符號 $ H(K, x) $ 來表示一個鍵控 MAC。
您的簡單協議版本似乎允許反射攻擊。
首先是對手 $ A $ 與 $ B $ :
$ A \to B $ : $ \mathrm{id}_A $ , $ n_A $
$ B \to A $ : $ \mathrm{id}_B $ , $ n_B $ , $ H(K, n_A) $
然後 $ A $ 使用 nonce 啟動第二個會話 $ n_B $ :
$ A \to B $ : $ \mathrm{id}_A $ , $ n_B $
$ B \to A $ : $ \mathrm{id}_B $ , $ n_B’ $ , $ H(K, n_B) $
現在 $ A $ 發送 $ H(K, n_B) $ 在第一個會話中給 Bob:
$ A \to B $ : $ H(K, n_B) $
您總是希望包含消息編號,以及發送消息的人和接收消息的人。您還希望驗證每條資訊。
如果你信任 $ hash $ 和隨機數的隨機性和 $ K $ 和它的長度,我看不出簡單版本有什麼特別的問題。(除了一個,我會回到這個)
它確實允許任何攻擊者獲取 $ hash(K||x) $ 對於任何選擇 $ x $ (與“強化”版本不同)但考慮到攻擊者能夠嗅探流量,如果 $ K $ 是弱的、非隨機的或 $ hash $ 不安全 - 取決於進行身份驗證的頻率。
總體而言,“強化”版本可能會提供輕微優勢,如果 $ hash $ 或者隨機性部分不可靠,但如果你不能相信這些,那麼你在其他地方就會遇到嚴重的問題。
現在對於我提到的一個問題,讓我們說 $ A $ 發送挑戰, $ B $ 嘗試發送正確的答案,但 $ C $ (作為攻擊者)控制不安全的通道並擷取消息並從他的機器重新發送。現在 $ A $ 收到了對挑戰的正確響應,但來自不同的機器。做 $ A $ 現在將未加密的敏感數據發送到 $ C $ ? 如果沒有,攻擊者仍然可以使 $ A $ 將流量發送到 $ C $ 代替 $ B $ 有效地執行某種拒絕服務 $ B $ . 執行時要非常小心。