Hmac
在什麼情況下可以使用“H(pass||data)”?
我知道 HMAC 的主要動機是擴展攻擊。如果數據總是在應用程序中隱含內容長度,或者甚至明確放入雜湊中,我會覺得 HMAC 是不必要的。其動機是允許使用廣泛可用的原語對密鑰進行基於密碼的加密,並定期輪換主密碼,而無需重新加密數據(但重新加密密鑰):
file.name = "foo.txt" file.iv = freshRandom256Bits() filekey = freshRandom256Bits() #only master learns this #encrypted key file.encryptedKey = sha256(masterpwd+":"+file.iv) ^ filekey #make it hard to forge data file.auth = sha256(masterpwd+":"+file.owner+":"+file.encryptedKey) #write data stream and file meta, then filekey goes out of scope writeEncryptedIO(file, filekey)
在這種情況下,
encryptedKey
具有已知長度。在那種情況下,HMAC 不是絕對必要的,不是嗎?如果我確實使用了 HMAC 變體,例如:$$ h(k || h(k || data)) $$ 它真的能給我帶來什麼嗎?可以用規定的常數省略 XOR 嗎?我的印像是 HMAC 好的全部原因是它通過使附加的東西
k
具有已知長度來解決擴展問題。
我認為Proneel 和 van Oorschot(MDx-MAC 和 Building Fast MACs from Hash Functions,CRYPTO'95)在提案 4 中的攻擊適用。PulpSpy在回答我關於 H(pass||length(data)||data) 的問題時引用了它。對於固定長度的數據,這相當於密鑰的已知後綴。
命題 4 簡而言之,對於通常涵蓋 H(…||data||…) 的通用結構,其中 H 是 $ n $ -bit 散列函式,有一種攻擊允許攻擊者替換一些尾隨塊。然而,攻擊確實需要大約 $ 2^{n/2} $ 已知的文本-MAC 對,這對於 256 位散列是不可行的。所以這個 20 年前的結果展示了理論上的攻擊。我不知道是否有更近期的結果表明更實際的攻擊。