Hash

哪種算法性能更好(HMAC、UMAC 和 Poly1305)?

  • March 13, 2018

我想實現一個需要對其消息進行完整性和身份驗證的協議。我發現了很多提供完整性和身份驗證的算法,例如 HMAC、UMAC 和 Poly1305。所以我很困惑我必須使用哪一個。請問,我能知道哪個更好嗎?

首先,HMAC——具有任何特定的散列函式,比如 HMAC-SHA256——與 UMAC 和 Poly1305 是不同類型的東西。因此,直接比較它們會產生誤導。

HMAC-SHA256 是一個偽隨機函式族,或PRF,具有長輸入和短輸出,意味著一個鍵控函式族 $ H_k\colon {0,1}^* \to {0,1}^{256} $ 這樣如果 256 位密鑰 $ k $ 是均勻分佈的,那麼 $ H_k $ 似乎均勻分佈在所有功能中 $ F\colon {0,1}^* \to {0,1}^{256} $ . 您可以使用它來驗證消息,方法是使用 $ t = H_k(m) $ 作為身份驗證標籤,因為對手不知道 $ k $ 猜不透 $ H_k(m) $ 比不知道的對手好得多 $ F $ 可以猜到 $ F(m) $ , 而他們有一個 $ 2^{-256} $ 一次嘗試猜測的機會。

UMAC 和 Poly1305 是一次性驗證器。 您可以使用密鑰 $ k $ 一次驗證單個消息 $ m $ 通過使用 $ t = \operatorname{Poly1305}_k(m) $ 作為身份驗證標籤。如果你曾經透露 $ \operatorname{Poly1305}_k(m) $ 和 $ \operatorname{Poly1305}k(m’) $ 在哪裡 $ m \ne m’ $ , 對手可以輕鬆計算 $ k $ 並在他們選擇的任何消息上偽造身份驗證標籤。但是您可以將它們擴展為處理許多消息,每個消息都有一個不同的序列號或非衝突隨機標記 $ n $ 稱為nonce,通過將它們與 PRF*組合,而不是使用,*例如, $ t = \operatorname{Poly1305}{k_n}(m) $ , 在哪裡 $ k_n = \operatorname{HMAC-SHA256}_k(n) $ . 你絕不能重複使用相同的 $ (k, n) $ 與兩條不同的消息配對。

有關消息身份驗證程式碼、一次性身份驗證器、HMAC 和偽隨機函式係列的更多資訊,較早的問題有幾個很好的答案。

通常,這些天,Poly1305 用於稱為NaCl crypto_secretbox_xsalsa20poly1305的預定義組合或libsodium 的變體之一,它使用 PRF XSalsa20 來派生一次性密鑰 $ k_n $ 同時作為流密碼派生用於加密消息的一次性填充。 這種經過身份驗證的加密組合,crypto_secretbox_xsalsa20poly1305,在幾乎任何 CPU 上都比任何涉及 HMAC 的經過身份驗證的加密都要快得多。 (可能的例外:也許在一個微型微控制器上,硬體支持 HMAC-SHA256,但不支持 XSalsa20 或 Poly1305。)

這是否意味著 HMAC-SHA256 沒用? ,您在對話中並不總是有消息序列號。例如,如果您在一個主要是無狀態的 Web 應用程序中分發不記名令牌,為了使用 Poly1305 作為身份驗證器,您必須包含一個 $ {\geq}192 $ -位隨機選擇隨機數作為 PRF 的輸入以選擇密鑰,與 128 位 Poly1305 輸出一起,驗證器標籤將花費 320 位空間,而基本相同的安全性(對於短消息和少量數據)您可以改用 HMAC-SHA256 的 128 位截斷,或 BLAKE2s-128 或 KMAC128-128。

引用自:https://crypto.stackexchange.com/questions/56429