Message authentication codes - MACs消息认证码是经过特定算法后产生的一小段信息,检查某段消息的完整性,以及作身份验证。它可以用来检查在消息传递过程中,其内容是否被更改过,不管更改的原因是来自意外或是蓄意攻击。同时可以作为消息来源的身份验证,确认消息的来源。-- 《百度百科》
MAC的工作原理
- Alice和Bob生成并共享密钥K
- Alice使用K在消息M上生成标签T,并将M和T一起发送给Bob
- Bob使用K检查T是否根据M和K进行验证
- 目标:M的真实性或完整性
- 真实性:M源自Alice
- 完整性:M在从Alice到Bob的过程中未被修改
如果没有钥匙我们能验证真实性吗?
想象一个不需要密钥的校验和算法(Checksum),对手能否在不被抓到的情况下更改消息?
- CheckSum算法是公共的,因此将M更改为M',然后使用该算法生成新标签T',并将(M,T)替换为(M',T')
这被称为错误检测代码
- 示例:MD5 散列/摘要、CRC码
- 无法提供对抗性攻击的真实性保证
- 但可以针对不受控制的通信或存储错误提供错误检测能力
- 示例:一个简单的奇偶校验码(所有M位的异或)可以提供多达1位错误的错误检测
形式语法
MAC方案是3种算法的集合:
- 密钥生成算法(随机)
- 输入:安全参数𝑛, 输出:𝑛-位键𝐾
- MAC(生成)算法(可能是随机的)
- 输入:键𝐾, 消息𝑀, 输出:MAC标签𝑇
- 验证算法(确定性)
- 输入:键𝐾, 消息𝑀, 标签𝑇, 输出:验证状态位𝑉
MAC安全
对手可能具备的能力:
- 被动对手:窃听(M,T)
- 主动对手:选择自己选择的消息并查看标签:选择消息攻击Chosen-Message Attack(CMA)
- 对手可能的目标:
- 破坏完整性/真实性:诱骗Bob接受非Alice发送的信息:伪造
UF-CMA安全
UF-CMA:unforgeability under chosen message attack - 选择消息攻击下的不可伪造性
- CMA:对手可以进行MAC查询
- UF:对手通过在新消息上伪造标签获胜
- UF-CMA安全:没有一个可行的对手拥有不可忽视的UF-CMA优势(即赢得UF-CMA比赛的概率)
伪码格式:
常见MAC使用方式
MAC不需要是随机的。在实践中,大多数MAC都是确定性的,因此验证只需运行MAC算法即可。
- 密钥生成(随机):𝐾 ← 𝐾𝑒𝑦𝐺𝑒𝑛(𝑛)
- MAC(生成)(确定性):𝑇 ← 𝑀𝐴𝐶𝐾 𝑀
- 验证(确定性):
- 给定(𝐾, 𝑀, 𝑇) 运行MAC算法并检查输出是否是相同的标签,即以下条件是否成立
- 𝑇 = 𝑀𝐴𝐶𝐾 𝑀
构建MAC
- MAC标签需要对对手不可预测
- 使用伪随机函数(PRF)
𝑀𝐴𝐶 𝐾, 𝑀 ≜ 𝑃𝑅𝐹(𝐾, 𝑀)
- 可以表明,如果PRF是安全的,则MAC是UF-CMA
- 问题:只能发送MAC固定长度的消息
原始的CBC-MAC
- 使用类似CBC的结构
- 无需IV
- 函数不需要是可逆的
- 未披露中间值
- 如果是,MAC将被伪造:给定消息的MAC,其前缀的MAC将被显示
原始的CBC-MAC不属于UF-CMA
- 易受长度扩展攻击
- 对手:
安全的CBC-MAC
- 属于UF-CMA安全
- 需要提前知道消息长度
- 属于UF-CMA安全
- 消息长度不需要事先知道,但具有更长的密钥(K,K')
MAC和Replay攻击
如果(M,T)被窃听并重放回Bob,它将再次验证
- 例如,从Alice到Bob的命令(例如远程API调用)
- 因此MAC无法抵御重放攻击
- 实用解决方案:使用计数器或时间戳
总结:
- MAC在对称密钥设置中提供真实性/完整性
- 预期的安全级别:所选消息下的不可伪造性攻击(UF-CMA),无法通过错误检测代码实现
- CBC-MAC是一种基于伪随机函数的安全构造,HMAC是另一个基于散列函数的函数
- MAC不提供防止重放攻击的保护
- MAC不提供不可否认性
注:缩写的密码原语可以看之前的笔记,都有介绍过