网络环境中的攻击
- 泄密:没有密钥的接收方获得了消息
- 传输分析:分析双方的通信模式
- 伪装:声称这条消息来自某个合法实体
- 内容修改
- 顺序修改
- 计时修改:对消息延时、重放
- 发送方否认发送过某条消息
- 接收方否认接收过某条消息
对于上述攻击,可以采取的手段有:
- 消息加密:应对泄密、传输分析
- 消息认证:应对伪装、内容修改、顺序修改、计时修改
- 数字签名:应对发送方否认
- 应对接收方否认需要特定协议
消息认证
消息认证是验证收到的消息确实来自真正的发送方且未被修改的消息
消息认证一定包括:
- 下层——产生认证符的函数
- 上层——接收方根据认证符验证消息真实性
产生认证符的函数称为认证函数
- 消息加密:整个消息密文作为认证符
- 消息认证码MAC:消息和密钥的公开函数,产生定长的值
- Hash函数:任意长的消息映射为定长的Hash值的公开函数
消息加密
对称加密的消息认证
-
对明文消息计算错误检测码(或帧校验序列 FCS)
-
对加入FCS的消息加密,传输密文
先FCS再加密才具有认证效力,先加密再FCS是可以模仿的
然而,由于A和B具有对称的密钥,接收方可以伪造信息,发送方也可以否认信息,即这种认证不提供数字签名
公钥加密的消息认证
一般而言,公钥加密只提供保密性,因为任何人都知道接收方的公钥,无法认证发送方身份
一种方法是:
- A用A的私钥将消息明文加密,得到数字签名
- A再将得到的密文用B的公钥再次加密,发送给B
- B用自己的私钥解密,得到A经过数字签名后的消息
- B再用A的公钥解密,确认消息确由A发出
然而这种方法使用了4次公钥算法,复杂度很高
公钥加密的数字签名接收方无法伪造,于是发送方也无法否认
消息认证码 MAC
MAC利用密文生成一个固定长度的短数据块,将其附加在消息之后,即:
其中为输入消息,为MAC函数,为收发双方共享密钥
MAC函数与加密类似,但不要求可逆性,只需要比对即可
双方使用的密钥相同,无法提供数字签名
注 可以提供数字签名的含义是,接收方根据自己的已知信息无法伪造出发送方发出的消息,于是第三者也可以确信消息一定是由发送方发送的
MAC的两种处理方式:
- 与明文相关的认证:先认证再加密,即发送,||表示拼接
- 与密文相关的认证:先加密再认证,即发送
Hash函数
类似MAC,但Hash函数不使用密钥,生成一个固定大小的Hash码
Hash码仅仅是输入消息的函数,也被称为消息摘要(Message Digest, MD)
Hash码需要具有错误检测能力:即改变任何一位或几位,一般都会导致hash码的改变
几种处理方式:
- 需要传递密文:发送
- 不需要传递密文:发送,处理成本更低,且能提供认证
- 非对称加密hash码:发送,可以提供数字签名
- 公钥签名+密文传递:发送
- 秘密值:发送,其中是双方知道但不在网络上发送的秘密值,于是消息无法伪造,提供了认证
- 叠加:
Hash函数需要满足的要求:
- 对报文长度无限制
- 产生的hash码长度固定
- 单向性:正向计算容易,反向计算困难
- 抗弱碰撞性:给定,找到且在计算上不可行
- 抗强碰撞性:找到,,使在计算上不可行
安全hash函数的一般结构
将报文分为每组长度位的个分组(时补零),设为
给定一个位初始值,进行以下计算:
其中是一个压缩函数,将位值和位分组结合起来得到新的位值
设计安全hash函数的问题转化成了设计抗碰撞的压缩函数的问题
常用Hash算法
MD5
输入:任意长的消息
分组:512bits
输出:128bits
设计目标:安全、快速、简洁,使用小端结构
第1步:增加填充位、填充长度
增加填充位1000…0使填充后的总长度模512余448,并在填充后的消息最后附上消息长度对的余数,于是总长度是512的倍数
填充的长度用小端法表示,在算法中增加长度是为了增强安全强度
第2步:初始化MD缓存
Hash函数的中间结果保存在四个32位寄存器中,其初始值如下:
1 | A = 0x01234567 |
计算Hash值的具体过程略
SHA
RIPEMD-160
数字签名算法DSS
消息认证和数字签名之间的区别:
- 消息认证用于防止通信双方以外的第三方的攻击,即第三方无法伪造出经过双方认证的消息
- 数字签名用于防止通信双方自身的攻击,例如接收方伪造一条消息,并生成其来自发送方
- 由于接收方可以伪造消息,发送方也就可以否认发送过的消息
数字签名必须具备的特征:
- 可以验证签名者、签名时间
- 可以认证被签的消息内容
- 签名可以由第三方仲裁
直接数字签名和仲裁数字签名
直接数字签名:
- 只涉及通信双方
- 例如X使用自己的私钥对消息或消息摘要加密后发送给Y
- 方法有效性依赖于私钥安全性
仲裁数字签名:
- 引入仲裁者A
- X的消息签名后发送给A,A对消息和签名进行检查,之后加上日期发送给Y