持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天
消息认证码
消息认证码可以实现“认证”和“检测篡改”这两个功能。密文的内容在传输过程中可能会被算改,这会导致解密后的内容发生变化,从而产生误会。消息认证码就是可以预防这种情况发生的机制
图解
01
首先,我们来看看什么情况下需要使用消息认证码。假设A在B处购买商品,需要将商品编号abc告诉B
02
此处,假设A使用共享密钥加密对消息进行加密。A通过安全的方法将密钥发送给了B
03
A使用双方共有的密钥对消息进行加密
04
A把密文发送给B,B收到后对密文进行解密,最终得到了原本的商品编号abc
05
以上是没有出现问题时的流程,然而在这个过程中可能会发生下面的情况
06
假设A发送给B的密文在通信过程中被X恶意篡改了,而B收到密文后没有意识到这个问题
07
B对被篡改的密文进行解密,得到消息xyz
08
B以为A订购的是编号为xyz的商品,于是将错误的商品发送给了A
09
如果使用消息认证码,就能检测出消息已被篡改。为了让大家了解实际的处理流程,我们再
一次回到A正要向B发送密文的时候
10
A生成了一个用于制作消息认证码的密钥,然后使用安全的方法将密钥发送给了B
11
接下来,A使用密文和密钥生成一个值。此处生成的是7f05。这个由密钥和密文生成的值就是消息认证码,以下简称为MAC(Message Authentication Code )
12
A将MAC(7f05)和密文发送给B
13
和A一样,B也需要使用密文和密钥来生成MAC。经过对比,B可以确认自己计算出来的7f05和A发来的7f05一致
提示:我们可以把MAC想象成是由密钥和密文组成的字符串的“哈希值”。计算MAC的算法有HMAC、OMAC、CMAC等。目前,HMAC的应用最为广泛
14
接下来,B只需使用密钥对密文进行解密即可。最终B成功取得了A发送过来的商品编号abc
15
X在通信过程中对密文进行了篡改是怎样一种情况呢?让我们回到A正要向B发送密文的时候
16
假设在A向B发送密文和MAC时,X对密文进行了篡改
17
B使用该密文计算MAC,得到的值是b85c,发现和收到的MAC不一致
18
由此,B意识到密文或者MAC,甚至两者都可能遭到了篡改。于是B废弃了收到的密文和MAC,向A提出再次发送的请求。
解说
加密仅仅是一个数值计算和处理的过程,所以即使密文被篡改了,也能够进行解密相关的计算。
如果原本的消息是很长的句子,那么它被篡改后意思会变得很奇怪,所以接收者有可能会发现它是被篡改过的。
但是,如果原本的消息就是商品编号等无法被人们直接理解的内容,那么解密后接收者便很难判断它是否被篡改。由于密码本身无法告诉人们消息是否被篡改,所以就需要使用消息验证码来检测。
补充说明
本文讲解了使用MAC检测密文是否被篡改的方法,继续进一步思考:X会不会为了让密文的篡改变得合理,而对MAC也进行篡改呢?
X没有计算MAC的密钥,所以即便他可以篡改MAC,也无法让篡改后的密文变得合理。所以,只要B计算出MAC,发现密文对应的MAC与自己算出的不同,就能确认通信过程中发生了篡改。
就像这样,只要使用消息认证码MAC,我们就能预防通信过程中的篡改行为。
然而,这种方法也有缺点。在使用消息认证码的过程中,AB双方都可以对消息进行加密并且算出MAC。也就是说,我们无法证明原本的消息是A生成的还是B生成的。
因此,假如A是坏人,他就可以在自己发出消息后声称“这条消息是B捏造的”,而否认自己的行为。如果B是坏人,他也可以自己准备一条消息,然后声称“这是A发给我的消息”。
使用MAC时,生成的一方和检测的一方持有同样的密钥,所以不能确定MAC由哪方生成。这个问题可以用下一节将会讲到的“数字签名”来解决。