12 消息认证码
12.1 对消息认证的要求
攻击类型:
保密消息
- 消息透露给没有合法密钥的任何人或程序
- 传输分析 在面向连接的应用中,分析连接的频率和持续时间,确定消息的数量和长度,无连接应用中确定消息数量和长度
消息认证
- 伪装
- 内容修改
- 顺序修改
- 计时修改:对消息的延迟和重播
数字签名
- 发送方否认
数字签名和抗攻击协议
- 接收方否认
12.2 消息认证函数
消息认证或数字签名机制在功能上基本都有上下两层,下层是产生某种认证符的函数,上层协议中将函数作为原语使接收方可以验证消息的真实性
可以产生认证符的函数类型
- Hash函数:以哈希值直接作为认证符号
- 消息加密:将密文作为认证符
- 消息认证码(MAC):它是消息和密钥的函数,它产生定长的值,以该值作为认证符
12.2.1 消息加密
对称密码中,A和B共享密钥K,A使用密钥K加密M,B可以使用K解密,在这种机制下,可以实现保密性和提供认证。问题在于M如果是任何位模式的情况下,B则无法判断密文是否是合法的明文所产生。为此必须限制合法明文是可能位模式的一个子集。这样伪造明文的攻击就很小了。但是接收方自动识别明文合法仍然很难,解决方案是在明文中加入错误检测码等使得明文具有某种易识别的结构,并且不通过加密函数不能重复这种结构,接受者解密后通过计算这个检验序列就能够判断是否是合法明文了
公钥加密。直接使用公钥加密Pm x PB= Pm x nB x G ,B使用nB和G反解出Pm很简单,但此时任何人都可能冒充a,因此不能保证真实性。若要提供认证,A则可以使用私钥加密,但是同样的任何人都能验证,无法提供保密性。若要实现保密和认证,A可以先使用私钥加密M,再用B的公钥加密上一步加密后的结果.但是很明显,操作复杂
12.2.2 消息认证码MAC
假设A和B事先都知道公共密钥K,A使用K生成一个数据块附加再M尾,B使用K同样计算块再比较则可以判别消息是否被修改、是否来自A以及消息序列是否正确(如果消息中使用了序列号的话)
可以看到A和B都是顺序计算的,所以MAC算法不要求可逆性,但是加密算法必须是可逆的
对称加密和公钥加密都可以实现消息认证,为什么还需要消息认证码呢?
- 将消息广播给接收者们,中心节点需要验证
- 接收者解密后再验证过程复杂,耗时耗资源
- 验证明文的计算机程序
- 一些场景不关心消息的保密性只关心认证
- 认证和保密分割开,使用更加灵活
- 仅仅在消息接受期间保护不够,使用加密机制的话,解密后就不再受保护,而使用验证可以一直保护信息不被修改
12.3 对消息认证码的要求
MAC称为密码校验和
若要加密的话,可以使用对称密码或者公钥密码
12.4 MAC的安全性
12.4.1 穷举攻击
12.4.2 密码分析
MAC的种类很多,各有各的分析
12.5 基于Hash函数的的MAC:HMAC
12.5.1 HMAC的设计目标
只能更好不能坏
12.5.2 HMAC算法
也是使用了密钥K
12.5.3 HMAC的安全性
依赖Hash函数的强度
12.6 基于分组密码的MAC:DAA和CMAC
12.6.1 数据认证算法
采用DES运算的密文块链接(CBC)方式,已经废止
12.6.2 基于密码的消息认证码(CMAC)
12.7 认证加密:CCM和GCM
认证加密是提供保密性和认证完整性的加密系统
四种认证和加密方案
- 先Hash 再加密
- 先认证再加密
- 先加密再认证
- 独立进行加密和认证
12.7.1 分组密码链 - 消息认证码
用于保护无限局域网的安全
12.7.2 Galois/计数器模式CCM
可以提高吞吐率和低成本、低延迟
基于CTR的认证加密方案在高速网络中是最高效的工作模式
12.8 密钥封装 KW
12.8.1 应用背景
使用三重DES或AES作为底层加密算法,目的是使通信双方安全交换密钥
一个协议通常需要调用不同层次的密钥,底层密钥调用更加频繁,高级密钥用来加密底层密钥
密钥封装模式是鲁棒的
12.8.2 密钥封装算法
对于64位分组操作
12.9 使用Hash函数和MAC的伪随机数生成器
12.9.1 基于哈希函数的PRNG
12.9.1 基于MAC的PRNG
让人更放心
|