Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

篡改与消息认证

复习

  • 窃听与对称加密:保护内容不被读懂
  • 校验和:能发现传输中的意外错误
  • 发现传输出错:校验值由内容计算得出

TL;DR

  • 保密并不等于防篡改
  • 消息认证码用密钥参与计算,能发现内容被改
  • 攻击者不知道密钥,就伪造不出正确的认证码
  • 认证解决“是不是你发的、有没有被改”

正文

  加密解决了“别人读不懂”。可还有一个问题没解决:别人能不能偷偷把内容改掉?

  能。加密保护的是“机密性”,并不自动保护“完整性”。

加密不等于防篡改

  你可能觉得,数据都加密成一团乱码了,攻击者还能做什么?

  其实他能做不少事。虽然攻击者解不开密文,但他可以动手脚:翻转几个比特、把两段密文拼在一起、或者把消息整段替换掉。接收方解密后,可能得到一段被悄悄改动过的内容,却毫无察觉。

  读不懂,不代表改不了。 这是两件不同的事。

用密钥算一个“认证标签”

  要发现篡改,可以用消息认证码(MAC,Message Authentication Code)。

  它的做法是:发送方用双方共享的密钥,连同消息内容,一起算出一个短的认证标签,随消息发出。接收方收到后,用同样的密钥和内容再算一遍:

  • 结果一致:消息没被改过,而且确实来自持有密钥的一方
  • 结果不一致:内容被改动了(或对方没有密钥)

  关键在于,攻击者不知道密钥,所以他改完内容后,算不出正确的标签。只要他动了数据,标签就对不上,篡改立刻暴露。

和普通校验和的区别

  你可能会想起前面讲过的校验和。它们看着像,其实目的不同:

  • 校验和:防止意外造成的错误(比如噪声干扰)
  • 消息认证码:防止恶意的篡改

  校验和不需要密钥,谁都能算,所以攻击者改完数据后顺手重算一个即可,完全挡不住有意的修改。而消息认证码带了密钥,攻击者算不出,才真正起到了“认证”的作用。

  到这里,双方若已共享密钥,就能同时做到保密和防篡改。可密钥分发的老问题还在——这就要请出非对称加密了。

思考题 1

  为什么“加密”本身不能防止消息被篡改?

思考题 2

  消息认证码与普通校验和,最根本的区别是什么?

小结

知识点

  • 加密保护机密性,不保护完整性
  • 消息认证码用共享密钥计算认证标签
  • 无密钥者无法伪造正确标签,篡改会被发现
  • 校验和防意外,认证码防恶意

参考资料

  1. Wikipedia(zh):消息认证码:用密钥验证消息完整性与来源
  2. Wikipedia(zh):校验和:由数据计算得到的校验值

思考题答案(仅供参考)

思考题 1

  因为加密只保证攻击者读不懂内容,却挡不住他对密文动手脚,比如翻转比特或替换整段。接收方解密后可能得到被改动过的内容而毫无察觉。机密性和完整性是两回事。

思考题 2

  最根本的区别是“有没有密钥”。校验和不带密钥,任何人都能重算,因此挡不住有意的修改;消息认证码用共享密钥计算,攻击者不知道密钥就算不出正确标签,篡改必然被发现。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪