SHA-1 HMAC產生過程 HMAC (有时扩展为 英語:keyed-hash message authentication code , 金鑰雜湊訊息鑑別碼 , 或 英語:hash-based message authentication code ,雜湊訊息鑑別碼 ),是一種通過特別計算方式之後產生的訊息鑑別碼 (MAC),使用密碼雜湊函數 ,同時結合一個加密金鑰。它可以用來保證資料的完整性,同時可以用來作某個訊息的身份驗證 。
定義 根據RFC 2104,HMAC的數學公式為: HMAC ( K , m ) = H ( ( K ′ ⊕ o p a d ) | | H ( ( K ′ ⊕ i p a d ) | | m ) ) {\displaystyle {\textit {HMAC}}(K,m)=H{\Bigl (}(K'\oplus opad)\;||\;H{\bigl (}(K'\oplus ipad)\;||\;m{\bigr )}{\Bigr )}}
其中:
H 為密碼雜湊函數 (如SHA家族 ) 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
}
相關條目
参考文献 ^ RFC 2104, section 2, "Definition of HMAC", page 3.
常用函数 MD5 SHA-1 SHA-2 SHA-3/Keccak BLAKE2 SHA-3入围 (英语 : NIST hash function competition ) BLAKE Grøstl JH (英语 : JH (hash function) ) Skein (英语 : Skein (hash function) ) Keccak (胜出) 其他函数 CubeHash (英语 : CubeHash ) ECOH (英语 : Elliptic curve only hash ) FSB (英语 : Fast Syndrome Based Hash ) GOST (英语 : GOST (hash function) ) HAS-160 (英语 : HAS-160 ) HAVAL (英语 : HAVAL ) Kupyna (英语 : Kupyna ) LM hash (英语 : LM hash ) MD2 MD4 MD6 MDC-2 (英语 : MDC-2 ) N-Hash (英语 : N-Hash ) RIPEMD RadioGatún (英语 : RadioGatún ) SWIFFT (英语 : SWIFFT ) SipHash (英语 : SipHash ) Snefru (英语 : Snefru ) Streebog (英语 : Streebog ) Tiger (英语 : Tiger (cryptography) ) VSH (英语 : Very smooth hash ) WHIRLPOOL (英语 : Whirlpool (cryptography) ) SM3 X11 密码散列/密钥延伸 函数 Argon2 Balloon bcrypt Catena (英语 : Catena (cryptography) ) crypt(3) (英语 : Crypt (C) ) (DES) LM散列 (英语 : LAN Manager#LM hash details ) Lyra2 Makwa (英语 : Makwa (cryptography) ) PBKDF2 scrypt yescrypt 通用密钥派生函数 MAC算法 DAA (英语 : Data Authentication Algorithm ) CBC-MAC (英语 : CBC-MAC ) HMAC OMAC (英语 : One-key MAC ) /CMAC (英语 : CMAC ) PMAC (英语 : PMAC (cryptography) ) VMAC (英语 : VMAC ) UMAC (英语 : UMAC ) Poly1305 认证加密 模式攻击 设计 雪崩效应 碰撞 默克尔-达姆加德结构 (英语 : Merkle–Damgård construction ) 标准化 CRYPTREC (英语 : CRYPTREC ) NESSIE (英语 : NESSIE ) NIST散列函数竞赛 (英语 : NIST hash function competition ) 实际应用