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 次

操作步骤如下:

  1. 在密钥 K 后面填充 0,使其成为长度为 64byte 的字符串。
  2. 用第一步得到的 64byte 的字符串与 iPad 作按位异或;
  3. 将消息 Message 附加到第二步产生的 64byte 字符串后面;
  4. 对第三步产生的数据流用散列函数 SM3 计算消息摘要;
  5. 用第一步得到的 64byte 的字符串与 oPad 作按位异或;
  6. 将第四步生成的消息摘要附加到第五步的 64byte 字符串之后;
  7. 对第六步产生的数据流用散列函数 SM3 计算消息摘要,作为输出

 

mac函数可以用hash函数来构造,就叫做hmac,也可以使用对称加密函数来构造mac,如sm4(也叫sm4mac)。

posted on 2021-09-08 16:01  yuzyong  阅读(2914)  评论(0编辑  收藏  举报