金鑰雜湊訊息鑑別碼











SHA-1 HMAC產生過程


金鑰雜湊訊息鑑別碼英语:Keyed-hash message authentication code),又稱雜湊訊息鑑別碼Hash-based message authentication code,縮寫為HMAC),是一種通過特別計算方式之後產生的訊息鑑別碼(MAC),使用密碼雜湊函數,同時結合一個加密金鑰。它可以用來保證資料的完整性,同時可以用來作某個訊息的身份驗證。




目录






  • 1 定義


  • 2 实现


  • 3 相關條目


  • 4 参考文献





定義


根據RFC 2104,HMAC的數學公式為:
HMAC(K,m)=H((K′⊕opad)||H((K′⊕ipad)||m)){displaystyle {textit {HMAC}}(K,m)=H{Bigl (}(K'oplus opad);||;H{bigl (}(K'oplus ipad);||;m{bigr )}{Bigr )}}{displaystyle {textit {HMAC}}(K,m)=H{Bigl (}(K'oplus opad);||;H{bigl (}(K'oplus ipad);||;m{bigr )}{Bigr )}}


其中:




H為密碼雜湊函數(如MD5或SHA-1)


K為密鑰(secret key)


m是要认证的消息


K'是从原始密钥K导出的另一个秘密密钥(如果K短于散列函数的输入块大小,则向右填充(Padding)零;如果比该块大小更长,则对K进行散列)

|| 代表串接

⊕ 代表異或(XOR)


opad 是外部填充(0x5c5c5c…5c5c,一段十六进制常量)


ipad 是内部填充(0x363636…3636,一段十六进制常量)



实现


下面的伪代码展示了如何实现HMAC。当使用以下散列函数之一时,块大小为64(字节):SHA-1、MD5、RIPEMD-128/160[1]


 function hmac (key, message) {
if (length(key) > blocksize) {
key = hash(key) // keys longer than blocksize are shortened
}
if (length(key) < blocksize) {
// keys shorter than blocksize are zero-padded (where is concatenation)
key = key ∥ [0x00 * (blocksize - length(key))] // Where * is repetition.
}

o_key_pad = [0x5c * blocksize] ⊕ key // Where blocksize is that of the underlying hash function
i_key_pad = [0x36 * blocksize] ⊕ key // Where ⊕ is exclusive or (XOR)

return hash(o_key_pad ∥ hash(i_key_pad ∥ message)) // Where is concatenation
}


相關條目


  • 訊息鑑別碼


参考文献





  1. ^ RFC 2104, section 2, "Definition of HMAC", page 3.






Comments

Popular posts from this blog

Monte Carlo

Information security

章鱼与海女图