HMAC的加密:
HMAC (k,m) = H ( (k XOR opad ) + H( (k XORipad ) + m ) )
H 是一个Hash函数, 比如, MD5, SHA-1and SHA-256,
k 是一个密钥,从左到右用0填充到hash函数规定的block的长度,如果密钥长度大于block的长度,就对先对输入key作hash。
m 是需要认证的消息,
代表“连接”运算,
XOR 代表异或运算,
opad 是外部填充常数(0x5c5c5c…5c5c,一段十六进制常量)
ipad 是内部填充常数(0x363636…3636,一段十六进制常量)
HMAC-MD5流程
输入消息串m:123456(utf8)
密钥k: 12345(utf8)
result:b8e91a37b5a5b21ea7aec961b3eea43b
![](https://i-blog.csdnimg.cn/blog_migrate/4b3d53bad44325bb001eb2d6b5eb78f5.png)
如何从明文变成密文的呢?中间经过哪些步骤
![](https://i-blog.csdnimg.cn/blog_migrate/d964ccf6c30532e66a0187cf0180ff59.png)
第1步:
对密钥k进行填充,填充到一个分组长度。如果密钥k超过一个分组长度,对k作hash然后在填充到一个分组长度
hmac-md5:k需要填充到512比特--128hex--64字节
k = 3132333435(16进制)
填充后长度128:31323334350000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
第2步:
填充后的密钥和0x36做异或操作
![](https://i-blog.csdnimg.cn/blog_migrate/e9f2ab1fa262b75ed84ac13e1bffeb43.png)
07040502033636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636
第三步:
将第二步的结果和消息串m(16进制)做级联
07040502033636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636363636313233343536
第3步:
对第3步级联的结果做hash
![](https://i-blog.csdnimg.cn/blog_migrate/89e3dd5b09f3c8321c1da79e6fd06653.png)
第4步结果:1147f3110ffb80b11ecd00d040d2ed5e
第5步:
填充后的密钥和0x5c做异或操作
第5步结果:
6d6e6f68695c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c
第6步:
将第5步的结果和第4步结果hash的结果级联
第6步结果
6d6e6f68695c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c1147f3110ffb80b11ecd00d040d2ed5e
第7步:
对第6步的结果做hash
![](https://i-blog.csdnimg.cn/blog_migrate/da101583f11b63feb25c13d29c7f5e4c.png)
第7步的结果:
b8e91a37b5a5b21ea7aec961b3eea43b
第7步产生的结果和result结果一致
经过上面7个步骤:在整个运算过程中加了2次盐,做了2次hash(至少做了两次hash,如果密钥长度大于一个分组长度就是3次hash)
常见的HMAC种类
算法种类 摘要长度(bit)
HMAC-MD5 128
HMAC-SHA1 160
HMAC-SHA256 256
HMAC-SHA384 384
HMAC-SHA512 512