前面我们在讲HMAC的时候简单讲过了什么是MAC消息认证码。

简单点说MAC(Message Authentication Code)是一种确认完整性并进行认证的技术,取三个单词的首字母,简称MAC。它是一种与密钥相关联的函数。 HMAC就是MAC的一种实现。

MAC有好几种实现方式

  • 使用单向散列函数实现

    比如HMAC。

  • 使用分组密码实现

    使用AES之类的分组密码可以实现消息认证码。关于分组密码的详细内容,后面我们会做详细说明。

  • 其他实现

    其他实现方法如:流密码和公钥密码等。

对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都应该发送变化,从而使重放攻击失效。

  • 时间戳

    在消息里面包含了当前的时间,在服务器校验的时候去检查这个时间戳,如果相隔时间很短的话即认可这个消息。这里会有个双方时钟同步的问题,同时要预留一个间隔时间区间。如果在这个时间区间内发生了重放,还是会攻击成功。

  • 随机数nonce

    在双方通信之前,服务器先发送一个随机数给发送者,发送者在消息中包含这个随机数,并计算MAC值。因为每次请求的随机数都会变化,所以重发MAC攻击不成立。但是会增加额外的通信请求成本。

密钥推测攻击

密钥推测攻击实际上是一种暴力破解的方法,即通过MAC来反向推导出密钥。这就需要我们的MAC算法具有很好的抗暴力破解性。

MAC算法的缺陷

MAC算法的关键是发送者和接受者之间共享密钥,从而实现对消息完整性和认证的确认。但是MAC算法不能解决”第三方证明“ 和 ”防止否认“ 的问题。

第三方证明

假如小明给小刚发送了消息,小刚想向第三方机构证明这条消息确实是小明发出来的,但是MAC无法做到。

因为MAC是通过小明和小刚共享的密钥生成出来的,所以第三方机构只能确认这个MAC是由共享密钥生成的,但是不能确定是小明生成的还是小刚自己生成的。

防止否认

假如小明给小刚发送了消息,小刚收到消息之后做MAC验证,通过后知道消息是小明发出来的。

但是小明完全可以否认自己发送了这条消息,因为小刚拥有同样的密钥,可以伪造出同样的消息出来。

所以MAC算法无法做到防止否认。

更多教程请参考flydean的博客

MAC攻击及缺陷的更多相关文章

  1. 局域网安全-生成树攻击-ARP攻击-MAC攻击-VTP攻击-动态VLAN的攻击

    一.MAC layer attacks 1.CAM表的OVERLOAD 第三方设备不断发送变化的MAC地址,填满CAM表,对于后来合法的MAC地址不能学习到从而泛洪,这时攻击者将学习到合法者的数据包. ...

  2. mdk3洪水攻击教程

    使得路由器崩溃,直到重启. 1.iwconfig 查看网卡 2.airmon-ng start wlan0 开启网卡监控 3.airodump-ng mon0 查看附近路由信息 4.mdk3 mon0 ...

  3. 如何使用Reaver-PJ-Wi-Fi网络的WPA密码

    在正式开始之前,我还是要不厌其烦强调一下:知识就是力量,但是拥有力量不代表着可以为所欲为.触犯法律.同样,骑白马的不一定是王子,会开锁的也不一定是小偷.本文只是关于某些技术的实验与验证,只适用于学习. ...

  4. 如何使用Reaver破解Wi-Fi网络的WPA密码

    via: http://lifehacker.com/5873407/how-to-crack-a-wi+fi-networks-wpa-password-with-reaver 译者:Mr小眼儿 本 ...

  5. Cross-site Scripting (XSS) 阅读笔记

    本文源自 https://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29 通过阅读和翻译,并按照自己的理解,整理成如下文档. 概述 XSS ...

  6. 对于移动端 App,虚拟机注册或类似作弊行为有何应对良策?

    1.APP攻击大致策略 对APP进行攻击的一般思路包括反编译APP代码.破解APP通讯协议.安装虚拟机自动化模拟: a.首先看能否反编译APP代码(例如Android APP),如果能够反编译,从代码 ...

  7. 微信Netting-QRLJacking分析利用-扫我二维码获取你的账号权限

    首先我们来看一下QRLJacking的实际原理:.攻击者首先进行客户端QR会话,并将登录QR码复制到网络钓鱼网站.“现在,一个精心制作的网络钓鱼页面有一个有效和定期更新的QR码可以被发送给受害者.” ...

  8. Diffie-Hellman 算法

    Diffie-Hellman 算法描述: 目前被许多商业产品交易采用. HD 算法为公开的密钥算法,发明于1976年.该算法不能用于加密或解密,而是用于密钥的传输和分配.      DH 算法的安全性 ...

  9. WebApp 安全风险与防护课堂(第二讲)开课了!

    本文由葡萄城技术团队于原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 在昨天的公开课中,由于参与的小伙伴们积极性和热情非常高,我们的讲师Carl ...

随机推荐

  1. 自执行函数-[javascript]-[语法]

    在看别人的代码的时候,遇到了一种写法,之前没有见过,如下: ![](https://img2018.cnblogs.com/blog/1735896/201912/1735896-2019122114 ...

  2. vagrant 入门案例 - 快速创建 Centos7

    中文文档:http://tangbaoping.github.io/vagrant_doc_zh/v2/ 参考: https://blog.csdn.net/yjk13703623757/articl ...

  3. input radio点击选中再点击取消

    这里主要说一下这个jquery中的data()方法,个人感觉这个方法平时挺少用到的,所以说一说,按照官方的解释就是 向元素附加数据,然后取回该数据; 嗯,是的,就是这么简单. 那这里说一下这个方法的使 ...

  4. js 数组 随机排序

    方法一: function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1) + min) } fu ...

  5. udev规则,部署Multipath

    部署Multipath多路径环境 配置iSCSI服务 编写udev规则 配置并访问NFS共享 部署Multipath多路径环境 1 配置iSCSI服务 1.1 问题 本案例要求先搭建好一台iSCSI服 ...

  6. MES Auto Logout

    如果您在车间使用MES,可能存在这种情况有人在仍然登录的情况下偶尔离开终端.如果一段时间不使用终端,我们是否可以让用户自动注销. 1 首先,我们有一条using语句: using System.Run ...

  7. 【高并发】你知道吗?大家都在使用Redisson实现分布式锁了!!

    写在前面 忘记之前在哪个群里有朋友在问:有出分布式锁的文章吗-@冰河?我的回答是:这周会有,也是[高并发]专题的.想了想,还是先发一个如何使用Redisson实现分布式锁的文章吧?为啥?因为使用Red ...

  8. 如何使你的PPT更高调

    PPT是什么? 俗话说的好,PPT就是"屁屁踢"/笑脸. PPT是微软office三件套之一,也就是演示文稿,用于演示(说了给没说一样). PPT的用途 视觉辅助 自动演示 阅读 ...

  9. Java 方法之形参和实参 、堆、栈、基本数据类型、引用数据类型

    * 形式参数:用于接收实际参数的变量(形式参数一般就在方法的声明上) * 实际参数:实际参与运算的变量 * 方法的参数如果是基本数据类型:形式参数的改变不影响实际参数. * * 基本数据类型:byte ...

  10. Python爬虫系列(七):提高解析效率

    如果仅仅因为想要查找文档中的<a>标签而将整片文档进行解析,实在是浪费内存和时间.最快的方法是从一开始就把<a>标签以外的东西都忽略掉. SoupStrainer 类可以定义文 ...