HMAC算法
HMAC流程
HMAC以某种哈希算法为部件,全称是Hash-based Message Authentication Code
整体并不复杂,用公式表示就是:
- K为密钥
- m是要认证的消息
- H为Hash函数(如MD5、SHA-1、SHA-256)
- K’是从原始密钥K导出的另一个密钥
- 如果K短于Hash函数的输入长度,则补零使K达到Hash函数的输入长度;
- 如果K长于Hash函数的输入长度,则对K进行Hash使K变为Hash函数的输入长度
- || 代表串接
- ⊕ 代表异或(XOR)
- opad 是外部填充(0x5c5c5c…5c5c,一段十六进制常量)
- ipad 是内部填充(0x363636…3636,一段十六进制常量)
参考:https://www.qinless.com/1300
参考:https://www.cnblogs.com/shoshana-kong/p/11497676.html
参考:https://zhuanlan.zhihu.com/p/336054453
HMAC的应用
HMAC-SHA256算法
参考:https://fileem.com/getting-started-from-zero-hmac-sha256
HMAC-SHA256算法,是使用了SHA-256的HMAC算法。
依据HMAC和SHA-256,HMAC-SHA256算法的明文分组长度B为512-bit,密钥K长度任意(最小推荐长度为256-bit,一般应大于512-bit),输出的摘要值为256-bit。
HMAC-SHA256步骤
HMAC-SHA256算法加密步骤如下图所示:
①. 密钥填充。若密钥比SHA-256算法的分组长度B(512-bit)短,则需在末尾填充0,直到其长度达到单向散列函数的分组长度为止。若密钥比分组长度长,则要用SHA-256算法求出密钥的散列值,然后将这个散列值作为新的密钥;
②. 内部填充。将填充后的密钥与被称为ipad的序列进行异或运算,所形成的值为ipadkey。ipad是将00110110这一序列不断循环反复直到达到分组长度;
③. 与消息组合。将ipadkey与消息组合,也就是将ipadkey附加在消息的开头。
④. 计算散列值。将3的结果输入SHA-256函数,并计算出散列值。
⑤. 外部填充。将填充后的密钥与被称为opad的序列进行异或运算,所形成的值为opadkey。opad是将01011100这一序列不断循环反复直到达到分组长度。
⑥. 与散列值组合。将4的散列值拼在opadkey后面。
⑦. 计算散列值。将6的结果输入SHA-256函数,并计算出散列值,这个散列值就是最终的摘要内容。
HMAC实现
HMAC_Update函数:
int HMAC_Update(HMAC_CTX *ctx, const unsigned char *data, size_t len);
可以多次调用该函数来依次处理消息的不同部分。
在每次调用HMAC_Update函数时,会将当前处理的消息块与前一次调用函数时未处理完的消息块合并,并进行哈希计算。