消息完整性和哈希函数 哈希碰撞与生日攻击 HMAC (Message Integrity and Hash Function)
消息完整性和哈希函数
- 1. Message Integrity - 消息的完整性
- 1.1 消息安全性和消息完整性的联系
- 2. Message Authentication Code - 消息认证码
- 2.1 Defination
- 2.2 MAC 安全的定义
- 2.2 Replay Attacks - MAC的不足
- 2.3 MAC Contruction for Fixed-length Message
- 2.4 (Basic) CBC - MAC
- 2.41 (Basic) CBC - Mac 的安全性问题
- 2.42 能不能直接从tag里面恢复信息呢
- 2.43 CBC - MAC Extension 解决长度不可变的问题
- 3. Hash Function
- 3.1 哈希函数的简介
- 3.2 哈希函数的三个特性
- 3.21 Unpredictability 不可预测性
- 3.22 Preimage resistance 抗原像攻击
- 3.23 哈希碰撞和生日攻击
- 3.3 实践中的Hash Function
- 4. HMAC
- 4.1 Hash and MAC
- 4.2 HMAC 的实现原理
- 5. Authenticated Encryption - 认证加密术
- 6. Secure Communication Sessions
- 5.1 基本介绍
- 5.2 各种攻击
- 5.3 实现安全认证会话的方法
1. Message Integrity - 消息的完整性
前面我们很详细的讲解了 怎么保证信息的安全性, 从古典加密方式, 现代加密准则, 一次一密再到对称加密, 可以说我们安全方面的建设目前是有了一定的进展, 那么问题来了, 怎么保证消息的完整性呢? 首先我们来看下消息的安全性和消息的完整性的区别与联系
1.1 消息安全性和消息完整性的联系
安全和完整是可以有一个而没有另一个的, 不同的策略针对了不同的目标
加密可以检测消息的修改, 比如一个人修改了消息的密文导致解码的明文没有了意义, 这时我们就可以说这个消息被更改了, 但是这不是加密的意义, 加密的意义是为了防止消息被窃听, 对应了我们第一讲中的Interception:
加密一般来说不提供任何完整性.完整性对应的是Fabrication 和 Modification
2. Message Authentication Code - 消息认证码
2.1 Defination
A message authentication code 是由3个算法定义的: Gen, Mac, Vrfy.
- Gen: 生成一个随机的key.
- Mac: 这一步是生成用于认证是否被更改的tag t.
输入: key 和 message, 其实这个很好理解你要确保消息没被改动肯定要确保这个tag和源消息要联系在一起
输出: tag t -> Mack(m) - Vrfy:
输入: tag t 和 message ∈ m {0,1}* (一个特定长度的bit串)
输出: 如果接受的话(也就是没被改动的话)输出1, 不然拒绝的话(也就是被修改了或者丢失的话)输出0.
Vrfy~k~(m, Mac~k~(m) )=1
从这里是不是可以看出点问题, 这里的m根本不关心是密文还是明文, 因为我们根本不关心你的消息会不会被泄露, 我们只关心会不会有人来更改我们的数据, 如果有我们要有能力检测到并纠正.
下面我们来看下MAC的工作流程
在这里插入图片描述
本发送了一条信息, 并且附上了tag t, 这时候有个坏人掌控了他们的沟通信道, 在中间截获了消息并且发送了m’,t’ 接收方收到了这个更改后的消息, 这个坏人觉得大功告成了, 没想到接受放运行了verify算法后发现输出是0, 她意识到消息被更改了, 于是她通知对方去换一个安全的信道, 坏人的计划落空了. 在这里我们根本不关心秘密安不安全或者说我们就是明文传输不怕被别人看到, 但是我们关心信息有没有更改, 或者说发送方是不是接收方所期待的发送方.
2.2 MAC 安全的定义
- Threat model
(1). Adaptive chosen-message attack” 自适应的选择明文攻击 (仅仅比选择暗文攻击差一个档次)
(2). 假设攻击者可以诱导发送方对攻击者选择的消息进行身份验证 - 这和美军诱导日军发送密文是一样的选择明文 - Security goal
(1). 存在性不可伪造
(2). 攻击者不能在任何未被发送方认证的消息上添加虚假的标签
一个满足上述定义的MAC可以在任何需要完整性的地方使用
2.2 Replay Attacks - MAC的不足
什么是重放攻击呢? 重放攻击就是, 针对已经有的一条信息, 我完全copy发送给对方或者持有相同加密秘钥的第三方, 比如俄罗斯 中国 英国 在一个群里, 俄罗斯跟中国说石油涨价吧, 中国说好, 攻击者这时把好给复制了, 下次俄罗斯说借我点钱, 攻击者直接代替中方回复好,问题就来了. 由于是完全copy所以不会出现tag和信息不对等的情况那么vrfy出来一定是1也就是说一定会判定信息没被修改过, 从某种程度上来讲, 这是对的, 但是它没有办法在这种办法上保证发的那个人是你期盼的那个人. 总的来说这个方法如果只靠MAC自己是不行的.
- 但也不是很难解决比如加上时间戳或者其它的状态.
- 这个攻击是无法被不加状态的无状态机防范的.
2.3 MAC Contruction for Fixed-length Message
这个Fixed-length Message 是不是很像block cipher 每个block 信息的长度都是固定的, 那我们自然而然的想到我们是不是能用block cipher的方式生成秘钥.
- 写一个 F function: length-perserving psedorandom function
- 用上面的F构建一个MAC π function
- 用 F 去生成一个独一无二的key
- Mack(m) = output Fk(m)
- Vrfyk(m,t): output 1 iff Fk(m) = t
在 F 确实是一个 length-perserving perdorandom function 的情况下, MAC π 是一个安全算法.
注意这里的安全指的是完整性领域的安全定义就像上面说过的一样.
但是这个是有一些drawbacks的比如说, block cipher 每个块都是有固定的长度的很短, 那我们这样的构建就被限制到了认证很短的, 固定长度的信息, 下一步我们要去认证长的长度可变的信息. authenticate long, variable length message.
这个其实对应了之前我们讲的 Electronic Codebook mode:
2.4 (Basic) CBC - MAC
这个东西是什么呢, 就是用了cipher block chain mode 的MAC, 其实很简单刚才能加密的少无非是因为每个块之间相互独立, 那我们把他们串起来用串起来的信息获得t不就行了, 串起来的信息包含了前面所有信息, 所以只要有一个信息更改那么t所对应的vrfy算法解出来一定是0.
最后只输出最后那个tag ti:ti=Fk[mi XOR Fk[mi-1]]
Fk对应了上面的length perseving pesudorandom function:
把每个块出来的tag t和下一个明文消息异或后在通入tag生成器里, 这样生成的tag就会带有前面所有的明文消息信息. 但是与之前的CBC-AES不同的是我们这里只输出最后一个tag, 大家有没有发现在这一节中tag几乎就等于上一届中的暗文, 因为这一节中tag背后的认证才是要保护的东西, 就像上一节中密文背后的明文才是要保护的东西一样.
这个 CBC - MAC 和 CBC mode 有什么不同呢?
- CBC-MAC 是 没有 initialization vector的 也就意味着如果两条消息一样那他们的tag也是一样的.
- In CBC-MAC, only the final value is outputted 那么接收方用这个和上面的mi理论上就能验证消息了
2.41 (Basic) CBC - Mac 的安全性问题
- If F is a length-preserving pseudorandom function, then for anyfixed l, basic CBC-MAC is a secure MAC for messages of length l ⋅ n — I.e., the sender and receiver must agree on the length parameter l in advance
这里面的l指的应该是一个block的块数, n 应该是每个block里存放的信息长度.
2.42 能不能直接从tag里面恢复信息呢
这个问题我们先回去看下当初CBC mode 是怎么解出信息的, 很简单:
- 用第一个密文反解出第一个中间明文
- 用第一个中间明文去和IV异或获得第一个明文
- 用第二个密文用同样的方法获得中间明文2
- 中间明文2去和上一步的密文1异或获得明文2
- 剩下的以此类推
这里面的关键其实是每一步都生成了并输出了当前round的密文 而我们这里的每一轮的tag是没有导出的
我们从图中直接看一下
- 先从最后一个tag用解密算法解出中间明文
- 但是这个时候需要上面的tag解出明文信息mi, 可是你上一步就没有导出哇怎么可能解出来
2.43 CBC - MAC Extension 解决长度不可变的问题
目前为止我们只解决了长度不够的问题, 现在要去解决长度不可变的问题, 因为上面也说了, 每个block的长度是需要提前定义好的这也是CBC - MAC 安全的一个必要条件.
这个问题其实都不是个问题, 你想想我们当初为了解决那个CBC mode 里面信息完全一样密文也会完全一样的问题加入了Initialization Vector 我们现在照样可以在每条信息中封装长度l 如下图所示:
其实就是在应用 (Basic) CBC - MAC 之前先预先确定长度.
3. Hash Function
3.1 哈希函数的简介
什么是Hash 函数呢, 哈希函数其实就是一个映射方式, 将一个随意长度(arbitrary length message) 映射成一个短的, 长度固定的摘要(digest).
哈希函数有keyed和unkeyed之分, keyed就是在上面的输入不只有M还有一个秘钥key, unkeyed就是输入只有arbitrary length 的message, 正式地来说, 哈希方程一般是keyed, 但是在实践中我们不用key, 因此在本节的讲述中我们只涉及unkeyed Hash Function.
3.2 哈希函数的三个特性
3.21 Unpredictability 不可预测性
任何信息的哈希值都是不可预测的, 即使三个输入之间只差2位哈希值也天差万别:
- a is 01100001
- b is 01100010
- c is 01100011
这也叫做抗第一原像攻击攻击: 攻击者无法通过分析不同信息的哈希值获得原信息的消息.
3.22 Preimage resistance 抗原像攻击
这个其实叫做抗第二原像攻击因为, 但攻击者发现无法发现信息间的差别他就会想那我能不能直接逆回去获得原消息, 不巧的是这个也无法实现, 因为哈希函数是一个 one-way function:
3.23 哈希碰撞和生日攻击
首先来看下什么叫做哈希碰撞, 其实很简单就是两个不同的输入对应了一个相同的哈希值.
举个例子现在有个网站有很多的客户映射成了哈希值, 那如果A, B的哈希值是相同的那么理论上A或者B就可以知道对方在此网站上的全部信息. 对于攻击者来说我前两种方法行不通那我就制造哈希碰撞去获得你们的信息. 那么什么时候哈希碰撞100%发生呢?
-
消息完整性和哈希函数 哈希碰撞与生日攻击 HMAC (Message Integrity and Hash Function)相关推荐
- 不同表结构数据迁移_数据结构:哈希 哈希函数 哈希表
写在前面 希望你们看了能够有所收获,同时觉得不错的朋友可以点赞和关注下我,以后还会有更多精选文章分享给大家!大家可以关注一下java提升专栏 java提升zhuanlan.zhihu.com 什么是 ...
- 重温数据结构:哈希 哈希函数 哈希表
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 在学习 HashMap 前,我们先来温习下 Hash(哈希) 的概念. 什么是 Hash Hash(哈希),又称" ...
- php 整数转换为32 位,PHP哈希函数返回一个整数(32位int)(PHP hashing function that returns an integer (32bit int))...
PHP哈希函数返回一个整数(32位int)(PHP hashing function that returns an integer (32bit int)) 目标是使用INT(不是BIGINT或ME ...
- 【初阶与进阶C++详解】第十九篇:哈希(哈希函数+哈希冲突+哈希表+哈希桶)
- 哈希函数的原理及应用
哈希(Hash)函数又称为散列函数.杂凑函数.它是一种单向密码体制,即一个从明文到密文的不可逆映射,只有加密过程,没有解密过程. 哈希函数可以将满足要求的任意长度的输入经过变换后得到固定长度的输出.这 ...
- 哈希算法(哈希函数)的基本使用
哈希算法(哈希函数)的基本使用 什么是哈希? 哈希的原理和特点 数组与哈希表 哈希函数 哈希函数的冲突与碰撞 哈希算法 哈希的应用 什么是哈希? 如果我们需要誊抄一本新华字典,那么有什么方法呢?比如当 ...
- 哈希函数(散列函数)详解
哈希函数(散列函数)详解 Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换 ...
- 1.1 密码学哈希函数
我们需要理解的第一个密码学的基础知识是密码学哈希函数,哈希函数是一个数学函数,具有以下三个特性: ● 其输入可为任意大小的字符串. ● 它产生固定大小的输出.为使本章讨论更具体,我们假设输出值大小为2 ...
- 哈希(哈希表与哈希函数)
一.哈希 哈希函数是计算机领域特别是在密码学领域应用最广泛的算法之一,哈希表是数据结构中应用最广泛的结构之一,本博客将为大家介绍哈希函数,介绍哈希表. 1.哈希函数 2.哈希表 3.哈希函数在大数据中 ...
最新文章
- Tableau可视化分析实战系列(三十一)-如何对超市销售数据进行可视化分析
- oracle 表分析 影响,oracle 表分析
- matlab逆变换法产生随机数_matlab数值积分方法(一)
- 怎么绘制机械孔_机械制图中常用的图纸简化画法,相当适合初学者!
- android配置多个url,Retrofit中使用多个baseUrl
- 笔记31 笨办法学python练习39可爱的词典
- ubuntu 18.04安装Tenda U12驱动
- W3school离线手册最新版下载
- 某社区APP完整原型案例
- 亮度、对比度、直方图均衡化
- 功能总结之车载方案AutoPlay功能总结
- helm install Error: timed out waiting for the condition
- 计算机应用基础(专)【7】
- python 经纬度 地址批量转换
- 2019python程序员月薪多少_最新 | 2019年Python工程师的平均薪资是多少?
- 银河麒麟加完全自主的龙芯指令集,组合渡劫能否成功
- Spring Boot熟稔于心的20个常识
- OC5038内置 MOS 开关降压型 LED 恒流驱动器
- 人脸识别Face Recognition综述
- 迅捷电子相册快速生成视频的方法--win10专业版
热门文章
- 大家知道微信被举报以后,多久才恢复正常吗?
- 电脑右下角没有声音图标,电脑喇叭有声音解决
- Linux系统输入法黑屏问题
- 心法利器[70] | 短文本理解的难点和解决方案
- Window关闭端口的方法(445/135/137/138/139/3389等)
- antdPro动态路由
- nanovna使用说明_陌筱镜头附件其他 适用于NanoVNA 矢量网络分析仪 天线分析仪 短波 MF HF VHF UHF 天分【价格 图片 品牌 报价】-苏宁易购东运数码专营店...
- Flex 弹性盒子布局
- 认识常见中间件-redis(二)-redis缓存雪崩、缓存击穿、缓存穿透
- HTTPS单向认证,双向认证
- 不同表结构数据迁移_数据结构:哈希 哈希函数 哈希表