Hmac

為什麼這個 HMAC 構造/檢查不安全?

  • April 15, 2017

MAC的計算方式如下:

mac = sha1(secret || m)[0:8]

$$ 0:8 $$表示從結果雜湊中獲取前 8 個字元。 秘密的長度是未知的。使用者(和潛在的攻擊者)可以線上檢查特定 MAC 和消息對的有效性。

if(macInput == sha1(secret || m)[0:8]){
  // ok
}else{
  // access denied
}

這可以被攻擊嗎?我聽說可以,但我不明白為什麼以及如何。

好的,這有兩個問題:

首先,MAC 長度最多為 64 位,即攻擊者可以嘗試通過“僅”來暴力查找有效 MAC $ 2^{64} $ 送出,這對於今天的大公司來說是可行的。

如果它實際上只有 8 個十六進製字元,那麼每個十六進製字元最多編碼 4 位資訊,因此你得到 $ 8\cdot 4=32 $ MAC 安全位意味著暴力破解最多需要 $ 2^{32} $ (大約 40 億)試圖恢復一個有效的 MAC。

其次,更為嚴重的是 MAC 的簡單驗證,這可能會導致經典的定時側通道攻擊。

這種多字節相等驗證很可能是作為“優化”檢查實現的,即(以python-ish方式):

if len(lb)!=len(rb):
  return false
for (lb,rb) in zip(l_input,r_input):
  if lb != rb :
     return false
return true

它檢查輸入長度是否匹配,然後將兩個輸入中相同位置的所有字節配對,並在檢測到不匹配時立即輸出假,如果未找到不匹配則輸出真。

現在我們可以做的是測量驗證 MAC 所需的時間。因此,我們將從 7 個0字元開始,並將每個可能的值(字元)值添加到該字元串中。我們發送所有驗證。花費時間最長的那個在第一個字元上匹配。現在我們修復我們剛剛驗證的第一個字元,並使用相同的方法繼續處理第二個字元。我們繼續這個過程,直到我們恢復完整的 MAC 並獲得訪問權限。

如果我們得到第一個字元的所有相等時間,我們將迭代前兩個字元的所有可能選擇(根據需要放大)。如果我們知道資訊的大小 $ b $ (以位為單位)在恆定時間驗證資料結構中編碼(例如,8 字節表示,32 表示整數,…)並且我們知道 mac 資訊 $ l $ 以比特為單位,那麼我們最多對驗證預言機進行以下呼叫以恢復有效 MAC:

$$ n=2^b\cdot(l/b) $$ 如果在您的情況下需要驗證 8 個十六進製字元,則變為 $ 2^4\cdot 8=256 $ 呼叫驗證預言機(因為雜湊的有效資訊是由 4 位元素組成的 32 位)。

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