HMAC
HMAC可以用来加密、数字签名、报文验证等。
1. 消息认证码
消息认证码(Message Authentication Code,MAC)是基于消息和秘钥的公开函数,输出为定长数据:
假定通信双发共享秘钥K,发送方A向接收方B发送报文M并附上MAC,记为:
当B收到后,使用同样的秘钥K和M计算出MAC’。如果MAC=MAC’,则说明:
-
接收的报文M没有被修改。
-
接收的报文M是A所发送的。
MAC和加密类似,需要明文、秘钥、算法。但MAC算法不要求可逆性,而加密算法则要求可逆。
2. HMAC算法
Hash函数不使用秘钥,不能直接用于MAC。因为,直接发送的消息M和Hash结果h(M)一旦被截获,就能直接被攻击者伪造,变成M’和h(M’)发送出去。
Hash消息认证码(Hash-based Message Authentication Code,HMAC),是一种基于秘钥和散列函数进行消息认证的方法。它要求通信双方共享秘钥、约定算法、约定报文Hash运算(如MD5、SHA、SM3等)。
- K为秘钥,K+ 则是在K左边填充若干0后,长度为b的数据块。(如果K是160比特,b=512,则需要在左边加352个0)。
- ipad:b/8个00110110组成的字符串。
- Y0Y1…YL-1:发送的消息M,M被划分为L个分组,分组长度为b比特。其中,Yi为其中的第i个分组(0≤i≤L-1)。Y0Y1…YL-1附在分组Si之后,记为Si||M。
- IV:Hash函数输入的初始值。
- Hash:选定的Hash算法(如MD5、SHA-1、SM3),输出的Hash值长度为n比特。
- opad:b/8个01011100组成的字符串。
HMAC的整个运算过程可以描述如下:
- HMACk=H[(K+ ⊕opad)||H[K+ ⊕ipad]]