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运算的数据指针地址;

nd的长度;

md用于存放HMAC值;

md_lenHMAC值的长度。