HMAC用于保护消息的完整性,它采用摘要算法对消息、填充以及秘密密钥进行混合运算。在消息传输时,用户不仅传送消息本身,还传送HMAC值。接收方接收数据后也进行HMAC运算,再比对MAC值是否一致。由于秘密密钥只有发送方和接收方才有,其他人不可能伪造假的HMAC值,从而能够知道消息是否被篡改。
ssl协议中用HMAC来保护发送消息,并且ssl客户端和服务端的HMAC密钥是不同的,即对于双方都有一个读MAC保护密钥和写MAC保护密钥。
HMAC的实现在crypto/hmac/hmac.c中,如下:
unsigned char *HMAC(const EVP_MD *evp_md, const void *key, int key_len,
const unsigned char *d, size_t n, unsigned char *md,
unsigned int *md_len)
{
HMAC_CTX c;
static unsigned char m[EVP_MAX_MD_SIZE];
if (md == NULL) md=m;
HMAC_CTX_init(&c);
HMAC_Init(&c,key,key_len,evp_md);
HMAC_Update(&c,d,n);
HMAC_Final(&c,md,md_len);
HMAC_CTX_cleanup(&c);
return(md);
}
evp_md指明HMAC使用的摘要算法;
key为秘密密钥指针地址;
key_len为秘密密钥的长度;
d为需要做HMAC运算的数据指针地址;
n为d的长度;
md用于存放HMAC值;
md_len为HMAC值的长度。