深入浅出密码学(中)

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: 前言 在之前的文章《深入浅出密码学(上)》中,笔者为大家简要介绍了密码学中的加密跟单向散列函数的概念与应用。在这里先简单回顾下,由于网络通信过程中存在信息被窃听的风险,因此需要通过加密来防止窃听以保护信息安全。

前言

 

在之前的文章《深入浅出密码学(上)》中,笔者为大家简要介绍了密码学中的加密跟单向散列函数的概念与应用。在这里先简单回顾下,由于网络通信过程中存在信息被窃听的风险,因此需要通过加密来防止窃听以保护信息安全。此外,在网络通信中数据还存在被篡改的风险,因此我们还需要有一种机制能够识别数据是否被篡改,而单向散列函数正是能够识别数据一致性或完整性的一种机制。然而单向散列函数不能解决的一个问题是不能确认消息一定是发送者的本意,也就是说无法识别“伪装”,为什么这样说呢?且听我细细道来。

 

一、单向散列函数的局限性

 

为了说明单项散列函数的局限性,我们还是引入一个场景。小明从某个网站W上下载了一个开源软件,由于该软件是开源的,所以没必要使用加密算法进行加密以防止窃听,但是小明需要确定下载的开源软件是否是完整的,所以需要使用单向散列函数进行验证。因此小明从该网站同时将开源软件与该开源软件的散列值下载到本地再进行比对,发现下载的软件计算出来的散列值与网站上的散列值是一致的,因此可以断定该软件是完整的。但是这并不代表该软件确实是来自网站W,而不是来自其他地方,即单纯使用单向散列函数存在“伪装”的风险。为了说明这一点,我们假设有一个攻击者小黑,他截获了网站W发送给小明的软件A1与散列值A2,然后再发送另一份软件B1与散列值B2给小明,其中散列值B2即为软件B1的散列值。这种情况下小明收到的数据就是软件B1与散列值B2,而不是预期的软件A1与散列值B2了。但是在这种情况下,小明计算软件的散列值跟收到的散列值进行对比仍然是一致的,虽然数据已经被攻击者小黑替换了,但是小明却无法察觉。所以说单向散列函数无法识别“伪装”。要识别“伪装”,可以使用接下来将要介绍的消息认证码。

 

二、消息认证码

 

消息认证码是一种确认数据完整性并进行认证的技术,简称MAC。所谓认证,就是能验证消息的确是由某个人发送过来的,因此可以识别“伪装”。消息认证码的输入包括任意长度的消息和一个发送者与接收者共享的密钥,其输出为固定长度的值,这个值称为MAC值。根据任意长度的消息输出固定长度的值,这一点跟单向散列函数很类似,但是有一个最大的区别就是,单向散列函数不需要密钥,而消息认证码需要密钥。并且只有正确的密钥才能计算MAC值,没有密钥或者没有正确的密钥都是没办法计算出预期的MAC值的,而因为密钥是由通信双方共享的,因此只有通信双方才能对消息计算出正确的MAC值,故而使用消息认证码可以起到认证的作用,即验证消息确实是由可信方发送的。消息认证码的使用步骤如下:

 

 

  1. 小明跟小白首先需要约定好共享密钥。

  2. 发送者小明根据共享密钥对消息计算MAC值

  3. 发送者小明将消息与消息认证码发送给接受者小白

  4. 小白接收到消息后根据共享密钥计算出MAC值

  5. 小白将计算出的MAC值与收到的MAC值进行比较

  6. 如果两者一致,则说明消息没有被篡改,并且确实是由小明发送过来的。

 

从上面的步骤可以看出,消息认证码跟对称加密有点类似。两者的主要区别是:消息认证码的作用是为了验证消息完整性以及对消息发送者进行认证,而对称加密是为了保证消息的隐私性,防止被窃听;再者,消息认证码的认证过程需要发送消息跟MAC值,而对称加密只需要发送密文;还有一个区别是,MAC值一般具有单向性,即只能从消息计算出MAC值,不能从MAC值还原出消息,而对称加密则既可以将明文加密成密文,也能将密文解密成明文。

 

三、消息认证码的局限性

 

对了说明消息认证码的局限性,本文将引入一个场景进行说明。假设小明跟小白在通信的过程中使用了消息认证码,他们两个人除了正常通信外,还需要向第三方小灰证明消息的确是是自己发送或者对方发送的。那么在这种情况下,消息认证码是无法实现这个功能的。为什么这样说呢?大家回顾下上述生成消息认证码的过程,我们需要使用密钥才能生成MAC值,而密钥是由通信双方共享的,这就意味着通信双方都可以生成MAC值,也就是说小明跟小白都可以生成MAC值,这样一来就不能证明这个MAC值究竟是谁生成的,这也就导致了无法向第三方证明某条消息一定是对方发送的,同理也无法证明某条消息一定是自己发送的。

 

除此之外,消息认证码还有一个局限就是无法防止否认。简单来说就是存在抵赖的风险。其原因也是因为共享密钥导致的。因为密钥是通信双方共享的,因此通信双方都可以生成消息的MAC值,故而如果通信的一方发送了某些消息,又拒不承认,反而“诬陷”是对方发送的,在这种情况下消息认证码是无法进行仲裁的。

 

最后一个局限性还是因为共享密钥导致的,在之前的文章《深入浅出密码学(上)》中,讲解了对称加密带来的一个问题就是密钥的配送问题,同理消息认证码同样也有密钥的配送问题,密钥配送的安全性决定了消息认证码的安全性。

 

既然消息认证码有这么多局限性,那么是否有其他方法可以解决上述问题的?当然是有的。那就是数字签名。由于篇幅所限,后续再为大家介绍数字签名的原理。

 

如果觉得这篇文章对你有帮助,可以扫描下方二维码,关注本人公众号,获得更多优质文章推送。

 

 

相关文章
|
6月前
|
算法 安全 PHP
密码学系列之二:密码学基本概念
密码学系列之二:密码学基本概念
密码学系列之二:密码学基本概念
|
6月前
|
机器学习/深度学习 算法 JavaScript
密码学系列之四:一文搞懂序列密码
密码学系列之四:一文搞懂序列密码
|
Rust 算法 Go
【密码学】一文读懂MurMurHash3
本文应该是MurMurHash算法介绍的最后一篇,来一起看一下最新的MurMurHash算法的具体过程,对于最新的算法来说,整个流程和之前的其实也比较相似,这里从维基百科当中找到了伪代码,也就不贴出来Google官方给出的推荐代码了,先来看一下维基百科给出的伪代码,这里只有32位的伪代码。
2082 0
【密码学】一文读懂MurMurHash3
|
Rust 算法 安全
【密码学】一文读懂MurMurHash2
上次我们聊过了一代的MurMurHash算法,是的,我又来水文章了,今天呢,接着来聊一下二代的MurMurHash算法,二代算法的整体结构实际上和一代算法差不太多,只是对于每一轮数据的处理过程当中的运算有一些差异,算法的来源依然是来自于Google官网给提供的源码,对着源码看的结构,对于这个算法呢,有两个版本,一个是32位的,一个是64位的,对于32位的算法和64位的算法,区别在于两个初始的魔数不同,整体运算过程还是十分相似的。
2145 0
【密码学】一文读懂MurMurHash2
|
Web App开发 Rust 算法
【密码学】一文读懂ChaCha20
好久没写新的加密算法的原理了, 这次所选取的加密算法结构比较简单, 一起来看一下吧。
7438 0
【密码学】一文读懂ChaCha20
|
Rust 算法 网络安全
【密码学】一文读懂CMAC
介于上一篇文章比较水,然后这个和上一篇也比较相似,CMAC是为了解决DAA当中安全性不足的问题而出现的,这个算法一共有三个密钥,K, K1, K2, 其中K1和K2可以由K导出,接下来就来一起看一下CMAC的具体过程吧,这一篇文章其实也不长。
3608 0
【密码学】一文读懂CMAC
|
2月前
|
存储 安全 算法
解密现代密码学:从基础到实战
在数字时代,保护信息安全变得至关重要。本文将带你深入探索密码学的奥秘,从基础的加密算法到现代的加密技术,揭示如何在日常开发中实现数据的安全传输和存储。我们将一起学习加密的基本原理,探讨常见的加密技术,并提供实用的代码示例,帮助你在项目中实施强大的安全措施。
|
算法 安全 Go
【密码学】一文读懂HKDF
我这又来水一篇文章,来聊一下HKDF(基于HMAC的密钥导出函数)。密钥派生函数是密钥管理的组成部分,他的目标是通过一些初始的数据派生出来密码学安全的随机密钥。
3049 1
【密码学】一文读懂HKDF
|
6月前
|
机器学习/深度学习 算法 安全
密码学的100个基本概念
密码学的100个基本概念
|
12月前
|
存储 算法 安全
【11.10】现代密码学1——密码学发展史:密码学概述、安全服务、香农理论、现代密码学
【11.10】现代密码学1——密码学发展史:密码学概述、安全服务、香农理论、现代密码学
210 0