前面我们在讲HMAC的时候简单讲过了什么是MAC消息认证码。
简单点说MAC(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称MAC。它是一种与密钥相关联的函数。 HMAC就是MAC的一种实现。
虽然MAC可以同时验证消息的完整性和来源,但是仍然有多种攻击方式。
什么是重放攻击?顾名思义,重放攻击就是将之前的信息或者通信再次请求。我们举个例子。 1. 小明跟小刚在做借款通信,但是这个通信被小红监听到了。 2. 小明向小刚发起借款100元,在MAC中假设小明和小刚共享了密钥,小明通过密钥根据请求消息计算出了MAC,并将MAC和消息一起发送给小刚。 3. 小刚收到了消息和MAC,根据自己存储的密钥计算出MAC,将整个MAC和收到的MAC做对比,如果两个MAC相等,那么小刚就知道这个是小明发起的合法请求,于是做出借款100元的操作。 4. 因为小红监听到了小明跟小刚的通信,所以小红获取到了请求消息和生成的MAC,并保持起来。 5. 小红将第4步收到的消息和MAC再次发送给小刚。 6. 小刚收到消息和MAC后,验证发现MAC是正确的值,然后再次出借100元。 7. 重复5,6的步骤。
有上面的具体例子可以看出,只要监听者能够拿到消息和MAC值,既可实现重放攻击。
密钥推测攻击实际上是一种暴力破解的方法,即通过MAC来反向推导出密钥。这就需要我们的MAC算法具有很好的抗暴力破解性。
MAC算法的关键是发送者和接受者之间共享密钥,从而实现对消息完整性和认证的确认。但是MAC算法不能解决”第三方证明“ 和 ”防止否认“ 的问题。
假如小明给小刚发送了消息,小刚想向第三方机构证明这条消息确实是小明发出来的,但是MAC无法做到。
因为MAC是通过小明和小刚共享的密钥生成出来的,所以第三方机构只能确认这个MAC是由共享密钥生成的,但是不能确定是小明生成的还是小刚自己生成的。
假如小明给小刚发送了消息,小刚收到消息之后做MAC验证,通过后知道消息是小明发出来的。
但是小明完全可以否认自己发送了这条消息,因为小刚拥有同样的密钥,可以伪造出同样的消息出来。
所以MAC算法无法做到防止否认。