Hash

HMAC.Update 函式是如何工作的?

  • June 16, 2015

我知道標準 HMAC(key,msg) 函式是如何工作的,我想編寫一個實現更新函式的 HMAC 類的 Delphi 埠。問題是我不明白這個更新功能是如何工作的(例如更新功能,請參閱此處的 SSL 定義:https ://www.openssl.org/docs/crypto/hmac.html )。

如果我理解正確,這兩段虛擬碼應該返回相同的 HMAC(例如 Result1 = Result2):

程式碼1: HMAC.Init;HMAC.Update(‘key’,‘abc’); HMAC.Update(‘key’,‘def’); 結果1 = HMAC.摘要;

程式碼2: HMAC.Init;HMAC.Update(‘key’,‘abcdef’); 結果2 = HMAC.摘要;

我在這裡找到了 Python 實現:https : //hg.python.org/cpython/file/2.7/Lib/hmac.py 但我對 Python 一無所知(我是 Delphi 程序員),我也不了解它。有人可以向我解釋一下,或者,可以提供一個虛擬碼/Delphi 的例子嗎?

編輯: 也許我應該提供一些關於我問這個問題的原因的更多細節。基本上,我需要計算 HMAC(key,msg) 其中 msg 是流/文件的內容,它可能很大 - 因此它的內容不能立即傳遞給 HMAC 函式。因此,我需要讀取流的塊並不斷更新 HMAC 消息,以便在處理整個流/文件後,HMAC 摘要包含整個流的 HMAC。

讓我們簡要回顧一下,HMAC 的樣子:

$ HMAC_K(M):=H((K\oplus opad) || H((K \oplus ipad) || M)) $

正如您在此處所觀察到的,外部雜湊的計算完全獨立於消息。

因此,實現“更新”功能的標準方法是儲存密鑰並如下所示:

Init(Key):
Store the Key in K
Init two Hash-function instances H1 and H2
Feed (K XOR IPAD) into H1
Feed (K XOR OPAD) into H2

Update(Message):
Feed the Message into H1

Final:
Get the digest of H1 and feed it into H2
Output the digest of H2

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