前言
在之前的文章《深入浅出密码学(上)》中,笔者为大家简要介绍了密码学中的加密跟单向散列函数的概念与应用。在这里先简单回顾下,由于网络通信过程中存在信息被窃听的风险,因此需要通过加密来防止窃听以保护信息安全。此外,在网络通信中数据还存在被篡改的风险,因此我们还需要有一种机制能够识别数据是否被篡改,而单向散列函数正是能够识别数据一致性或完整性的一种机制。然而单向散列函数不能解决的一个问题是不能确认消息一定是发送者的本意,也就是说无法识别“伪装”,为什么这样说呢?且听我细细道来。
一、单向散列函数的局限性
为了说明单项散列函数的局限性,我们还是引入一个场景。小明从某个网站W上下载了一个开源软件,由于该软件是开源的,所以没必要使用加密算法进行加密以防止窃听,但是小明需要确定下载的开源软件是否是完整的,所以需要使用单向散列函数进行验证。因此小明从该网站同时将开源软件与该开源软件的散列值下载到本地再进行比对,发现下载的软件计算出来的散列值与网站上的散列值是一致的,因此可以断定该软件是完整的。但是这并不代表该软件确实是来自网站W,而不是来自其他地方,即单纯使用单向散列函数存在“伪装”的风险。为了说明这一点,我们假设有一个攻击者小黑,他截获了网站W发送给小明的软件A1与散列值A2,然后再发送另一份软件B1与散列值B2给小明,其中散列值B2即为软件B1的散列值。这种情况下小明收到的数据就是软件B1与散列值B2,而不是预期的软件A1与散列值B2了。但是在这种情况下,小明计算软件的散列值跟收到的散列值进行对比仍然是一致的,虽然数据已经被攻击者小黑替换了,但是小明却无法察觉。所以说单向散列函数无法识别“伪装”。要识别“伪装”,可以使用接下来将要介绍的消息认证码。
二、消息认证码
消息认证码是一种确认数据完整性并进行认证的技术,简称MAC。所谓认证,就是能验证消息的确是由某个人发送过来的,因此可以识别“伪装”。消息认证码的输入包括任意长度的消息和一个发送者与接收者共享的密钥,其输出为固定长度的值,这个值称为MAC值。根据任意长度的消息输出固定长度的值,这一点跟单向散列函数很类似,但是有一个最大的区别就是,单向散列函数不需要密钥,而消息认证码需要密钥。并且只有正确的密钥才能计算MAC值,没有密钥或者没有正确的密钥都是没办法计算出预期的MAC值的,而因为密钥是由通信双方共享的,因此只有通信双方才能对消息计算出正确的MAC值,故而使用消息认证码可以起到认证的作用,即验证消息确实是由可信方发送的。消息认证码的使用步骤如下:
小明跟小白首先需要约定好共享密钥。
发送者小明根据共享密钥对消息计算MAC值
发送者小明将消息与消息认证码发送给接受者小白
小白接收到消息后根据共享密钥计算出MAC值
小白将计算出的MAC值与收到的MAC值进行比较
如果两者一致,则说明消息没有被篡改,并且确实是由小明发送过来的。
从上面的步骤可以看出,消息认证码跟对称加密有点类似。两者的主要区别是:消息认证码的作用是为了验证消息完整性以及对消息发送者进行认证,而对称加密是为了保证消息的隐私性,防止被窃听;再者,消息认证码的认证过程需要发送消息跟MAC值,而对称加密只需要发送密文;还有一个区别是,MAC值一般具有单向性,即只能从消息计算出MAC值,不能从MAC值还原出消息,而对称加密则既可以将明文加密成密文,也能将密文解密成明文。
三、消息认证码的局限性
对了说明消息认证码的局限性,本文将引入一个场景进行说明。假设小明跟小白在通信的过程中使用了消息认证码,他们两个人除了正常通信外,还需要向第三方小灰证明消息的确是是自己发送或者对方发送的。那么在这种情况下,消息认证码是无法实现这个功能的。为什么这样说呢?大家回顾下上述生成消息认证码的过程,我们需要使用密钥才能生成MAC值,而密钥是由通信双方共享的,这就意味着通信双方都可以生成MAC值,也就是说小明跟小白都可以生成MAC值,这样一来就不能证明这个MAC值究竟是谁生成的,这也就导致了无法向第三方证明某条消息一定是对方发送的,同理也无法证明某条消息一定是自己发送的。
除此之外,消息认证码还有一个局限就是无法防止否认。简单来说就是存在抵赖的风险。其原因也是因为共享密钥导致的。因为密钥是通信双方共享的,因此通信双方都可以生成消息的MAC值,故而如果通信的一方发送了某些消息,又拒不承认,反而“诬陷”是对方发送的,在这种情况下消息认证码是无法进行仲裁的。
最后一个局限性还是因为共享密钥导致的,在之前的文章《深入浅出密码学(上)》中,讲解了对称加密带来的一个问题就是密钥的配送问题,同理消息认证码同样也有密钥的配送问题,密钥配送的安全性决定了消息认证码的安全性。
既然消息认证码有这么多局限性,那么是否有其他方法可以解决上述问题的?当然是有的。那就是数字签名。由于篇幅所限,后续再为大家介绍数字签名的原理。
如果觉得这篇文章对你有帮助,可以扫描下方二维码,关注本人公众号,获得更多优质文章推送。