Hmac

為什麼 HMAC/SHA 的 IV(常數)值是固定的?

  • June 13, 2017

為什麼 HMAC/SHA IV 具有固定值?我指的是在輸入任何數據之前包含在算法中的任意 H 常數。

為什麼它們不暴露給使用者,所以人們可以決定一個 IV 並相應地修改它(例如,在 java 中,它們是在散列函式規範中提供的,而不是由使用者提供的init)?

修改這些 IV 對算法有何影響?

雜湊 IV 值不提供給使用者,原因很簡單,因為它們不是必需的。

散列函式的整個想法是,您可以獲得一個幾乎唯一的值,該值不可撤銷地連結到輸入消息,而不會暴露消息的任何細節。使用 IV 會違背這個想法:每次更改 IV 時都會給你一個不同的值。

密碼不是這種情況,它需要隨機化才能保證 CPA 安全。如果他們不這樣做,那麼對於同一個鍵,重複消息將是相同的。CBC 當然可以從明文中的 a 開始,但這意味著密文總是必須被擴展。這可能是浪費的,因為不要求 IV 與密文一起發送。

這說明了為什麼不在散列函式的介面中包含 IV 的另一個原因。如果需要唯一值,您可以簡單地將其包含在消息中。它只會包含在雜湊計算中,而不是擴展雜湊的輸出。


現在實際上有不同的常數是有益的原因。

一種是縮短的散列值可能會洩漏有關完整或更少縮短的散列的資訊。例如,如果攻擊者擁有 SHA-512/256 雜湊,那麼攻擊者也將擁有 SHA-512/384 或 SHA-512 雜湊的第一部分。出於這個原因,這些散列實際上有不同的常數**。**

另一個原因是當使用雜湊時 1. 具有相同的輸入和 2. 用於不同的目的。在這種情況下,在散列中包含一些區分位可能是有益的。這是一種實際存在於 SHA-3 中的方案,其中 KMAC 算法和 SHAKE 函式使用與原始雜湊算法不同的幾個位。

HMAC 沒有這種保護。然而,它確實以兩種不同的方式使用密鑰,因此您必須創建一個非常奇怪的方案才能通過散列密鑰、消息和複製 HMAC 結果而陷入麻煩。


修改這些常量根本不應該影響算法。但是,如果您使用自己的常量值,那麼人們可能會懷疑您對算法的了解比他們自己多。最好將原始常量用作“無袖”值。

如果您需要某種額外的輸入,只需將其作為消息的一部分,確保消息的編碼是規範的。也就是說,確保可以區分消息中的不同欄位,例如通過在每個欄位之前添加長度前綴。

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