Hash
為什麼 H(message||secret_key) 不易受到長度擴展攻擊?
給定一個 Merkle-Damgård 散列函式 $ H $ ,我知道攻擊者可以偽造一條受 MAC 保護的消息,計算如下 $ H(\textrm{secret_key}||\textrm{message}) $ .
為什麼他不能對 MAC 構造執行相同的擴展攻擊 $ H(\textrm{message}||\textrm{secret_key}) $ ?
長度擴展攻擊如何應對 $ H(k||m) $ 工作?
對於 Merkle-Damgård 雜湊,如果你知道的話 $ H(x) $ 但不是 $ x $ 你仍然可以選擇一個 $ e $ 然後計算 $ H(x||p||e) $ . 和 $ x=k||m $ 你可以計算 $ H((k||m||p)||e)=H(k||(m||p||e)) $ 這是一個有效的身份驗證標籤 $ m||p||e $ .
為什麼它不起作用 $ H(m||k) $ ?
通過長度擴展,攻擊者選擇了擴展。唯一不平凡的製作方法 $ H(m||k||e) $ 一個有效的標籤是如果 $ e $ 以。。結束 $ k $ . 由於攻擊者不知道密鑰,他們不能將密鑰放在末尾 $ e $ 因此無法產生有效的標籤。
我應該使用什麼?
將 H(k||m) 與不易受到長度擴展攻擊的雜湊一起使用,例如 SHA3。或者將 HMAC 與較舊的雜湊函式一起使用,例如 SHA2。 $ H(m||k) $ 並不理想,因為它可以通過發現碰撞來攻擊 $ H $ . 碰撞是加密分析中更容易的攻擊之一,並且需要兩倍於目標安全級別寬度的雜湊函式。例如 SHA-256 用於 128 位安全級別。