Hash、MAC和HMAC
前段时间被MAC和HMAC搞的稀里糊涂,不知道什么时候用,也不知道他们有什么区别,在此记录一哈。
先比较下他们的特征
- hash只能验证数据完整性,无法保证数据防篡改,计算过程无密钥参与。
- MAC既可以验证数据完整性,也可以验证数据是由原始发送方发出的,计算过程有密钥参与,使用对称加密算法构造(一般使用ecb模式,即不需要iv向量),mac值为8字节(密钥长度的一半)。
- HMAC是mac的一种,可以验证数据完整性,也可以验证数据是由原始发送方发出的,使用hash函数来构造,hmac输出长度与hash长度一样(32字节)。
算法流程
MAC(参考银联标准)
* SM4 mac计算
* 1.数据不为16的倍数,需要补0
* 2.将数据16个字节进行异或,再将异或的结果与下一个16个字节异或,一直到最后
* 3.将异或运算后的最后16个字节 转换成32 个HEXDECIMAL:
* 4.取前16 个字节用MAK加密
* 5.将加密后的结果与后16 个字节异或
* 6.用异或的结果TEMP BLOCK 再进行一次SM4密钥算法运算
* 7.取运算后结果前8个字节作为MAC值。
为什么取前8字节作为mac值?
mac计算的最后结果与密钥长度一致(一般是16字节),猜,应该是sm4加密是可以解密得到原文,而hash的特征是不可逆,所以这里只取前8字节。
HMAC
iPad=一个字节(byte)的 0x36 重复 64 次;
oPad=一个字节(byte)的 0x5C 重复 64 次
操作步骤如下:
- 在密钥 K 后面填充 0,使其成为长度为 64byte 的字符串。
- 用第一步得到的 64byte 的字符串与 iPad 作按位异或;
- 将消息 Message 附加到第二步产生的 64byte 字符串后面;
- 对第三步产生的数据流用散列函数 SM3 计算消息摘要;
- 用第一步得到的 64byte 的字符串与 oPad 作按位异或;
- 将第四步生成的消息摘要附加到第五步的 64byte 字符串之后;
- 对第六步产生的数据流用散列函数 SM3 计算消息摘要,作为输出
mac函数可以用hash函数来构造,就叫做hmac,也可以使用对称加密函数来构造mac,如sm4(也叫sm4mac)。