HMAC算法

背景

首先说一下什么是MAC,MAC全称Message authentication code,即消息认证码。是经过特定算法后产生的一小段信息,检查某段消息的完整性,以及作身份验证。

在网络传输中,由于一般的传输通道是透明的,所以对消息进行认证是十分必要的,认证消息是否被修改,无论是恶意攻击或意外改变。一般的操作是对消息产生认证码,然后连同消息和认证码一起发送,接收方用同样的方法计算认证码,看两个认证码是否一致。

HMAC全称Hash-based message authentication code,即散列消息认证码(官方文档)是一个比较完善的消息认证码机制。是一种通过特别计算方式之后产生的消息认证码(MAC),使用密码散列函数,同时结合一个加密密钥。它可以用来保证数据的完整性,同时可以用来作某个消息的身份验证。

详细流程

调整秘钥长度

秘钥是收发双发都知晓的一个对称加密的秘钥。算法第一步要调整秘钥长度,使其和消息块长度匹配。分一下三种情况

  1. k<b:秘钥长度小于消息块长,这是需要在秘钥左边填充一定的0,使其等于消息块长
  2. k=b:不做任何处理
  3. k>b:对秘钥进行信息摘要,使其等于消息块长,摘要算法和HMAC中用到的散列算法一样

生成S1

将K与ipad进行异或运算生成S1,ipad = (00110110) 重复 b/8次,也就是说ipad长度和消息块长相等

填充

将消息M拼接到S1后面

消息摘要

对上一步拼接后的信息进行摘要得到H

生成S2

将K与opad进行异或运算生成S2,opad = (01011010) 重复 b/8次,也就是说opad长度和消息块长相等

填充

将前面摘要得到的H拼接到S2后面

消息摘要

对上一步拼接后的信息进行摘要得到HMAC。

整体流程还是很简单的,整体流程如下:

算法分析

HMAC主要解决的发送方的认证和消息完整性认证。首先中间涉及的秘钥只有收发双发知道,所以攻击者即使篡改消息也无法生成相应的HMAC,同样且只有持有正确秘钥的发送方才能正确生成HMAC。其次,由于摘要算法,只要消息不完整,验证也不会通过。最后,由于摘要算法是单向函数,所以无法从消息和HMAC推测秘钥。

但是HMAC也存在下面几个问题:

  1. 秘钥交换问题是一个普遍存在的问题,对于中间人攻击,HMAC也无能为力
  2. HMAC不适用与多个接收方情况,由于是对称加密,接收方并不能认证消息来自某个发送方,任何一个接收方都可以伪造消息
  3. 若是不同收发方使用不同的秘钥,则秘钥管理也比较困难
  4. 接收方也可能伪造消息,对于一个HMAC并不能判断具体是哪一方发出的。

题图来自unsplash:https://unsplash.com/photos/Anosw0HcGRk