篡改与消息认证
复习
- 窃听与对称加密:保护内容不被读懂
- 校验和:能发现传输中的意外错误
- 发现传输出错:校验值由内容计算得出
TL;DR
- 保密并不等于防篡改
- 消息认证码用密钥参与计算,能发现内容被改
- 攻击者不知道密钥,就伪造不出正确的认证码
- 认证解决“是不是你发的、有没有被改”
正文
加密解决了“别人读不懂”。可还有一个问题没解决:别人能不能偷偷把内容改掉?
能。加密保护的是“机密性”,并不自动保护“完整性”。
加密不等于防篡改
你可能觉得,数据都加密成一团乱码了,攻击者还能做什么?
其实他能做不少事。虽然攻击者解不开密文,但他可以动手脚:翻转几个比特、把两段密文拼在一起、或者把消息整段替换掉。接收方解密后,可能得到一段被悄悄改动过的内容,却毫无察觉。
读不懂,不代表改不了。 这是两件不同的事。
用密钥算一个“认证标签”
要发现篡改,可以用消息认证码(MAC,Message Authentication Code)。
它的做法是:发送方用双方共享的密钥,连同消息内容,一起算出一个短的认证标签,随消息发出。接收方收到后,用同样的密钥和内容再算一遍:
- 结果一致:消息没被改过,而且确实来自持有密钥的一方
- 结果不一致:内容被改动了(或对方没有密钥)
关键在于,攻击者不知道密钥,所以他改完内容后,算不出正确的标签。只要他动了数据,标签就对不上,篡改立刻暴露。
和普通校验和的区别
你可能会想起前面讲过的校验和。它们看着像,其实目的不同:
- 校验和:防止意外造成的错误(比如噪声干扰)
- 消息认证码:防止恶意的篡改
校验和不需要密钥,谁都能算,所以攻击者改完数据后顺手重算一个即可,完全挡不住有意的修改。而消息认证码带了密钥,攻击者算不出,才真正起到了“认证”的作用。
到这里,双方若已共享密钥,就能同时做到保密和防篡改。可密钥分发的老问题还在——这就要请出非对称加密了。
思考题 1
为什么“加密”本身不能防止消息被篡改?
思考题 2
消息认证码与普通校验和,最根本的区别是什么?
小结
知识点
- 加密保护机密性,不保护完整性
- 消息认证码用共享密钥计算认证标签
- 无密钥者无法伪造正确标签,篡改会被发现
- 校验和防意外,认证码防恶意
参考资料
- Wikipedia(zh):消息认证码:用密钥验证消息完整性与来源
- Wikipedia(zh):校验和:由数据计算得到的校验值
思考题答案(仅供参考)
思考题 1
因为加密只保证攻击者读不懂内容,却挡不住他对密文动手脚,比如翻转比特或替换整段。接收方解密后可能得到被改动过的内容而毫无察觉。机密性和完整性是两回事。
思考题 2
最根本的区别是“有没有密钥”。校验和不带密钥,任何人都能重算,因此挡不住有意的修改;消息认证码用共享密钥计算,攻击者不知道密钥就算不出正确标签,篡改必然被发现。
协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
封面图
设计师 | 南国微雪