计算机网络常问面试问题 3 —— 对称加密、非对称加密以及数字签名和数字证书

0、本文流程

为了便于统一行文思路,所以提前说明本篇流程:

  • 1、对称加密和非对称加密 各自的缺陷 引出 非对称加密+对称加密的综合利用
  • 2、非对称加密+对称加密的综合利用的缺陷引出数字签名技术
  • 3、数字签名技术的漏洞引出 数字签名和数字证书综合利用

1、对称加密、非对称加密

1.1、对称加密(Symmetric Cryptography)

1.1.1、定义

在对称加密算法中,加密和解密使用的是同一把钥匙,即:使用相同的密匙对同一密码进行加密和解密;

  • 发送方使用密钥将明文数据加密成密文,然后发送出去,接收方收到密文后,使用同一个密钥将密文解密成明文读取。
  • 常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6。
    在这里插入图片描述

加密:原文 + 密匙 = 密文

解密:密文 - 密匙 = 原文

1.1.2、特征

  • 加密计算量小、速度块,适合对大量数据进行加密的场景。
  • 对称加密通常使用的是相对较小的密钥,一般小于256 bit。因为密钥越大,加密越强,但加密与解密的过程越慢。如果你只用1 bit来做这个密钥,那黑客们可以先试着用0来解密,不行的话就再用1解;但如果你的密钥有1 MB大,黑客们可能永远也无法破解,但加密和解密的过程要花费很长的时间。

用对称加密可行吗?

  • 1、密钥传输问题:由于对称加密的加密和解密使用的是同一个密钥,所以对称加密的安全性就不仅仅取决于加密算法本身的强度,更取决于密钥是否被安全的保管,因此加密者如何把密钥安全的传递到解密者手里,就成了对称加密面临的关键问题。
  • 2、密钥管理问题:我们在加密用户的信息时,不可能所有用户都用同一个密钥加密解密吧,这样的话,一旦密钥泄漏,就相当于泄露了所有用户的信息,因此需要为每一个用户单独的生成一个密钥并且管理,这样密钥管理的代价也会非常大。

1.2、非对称加密(Asymmetric Cryptography)

1.2.1、定义

非对称加密有两个钥匙,及公钥(Public Key)和私钥(Private Key)。公钥和私钥是成对的存在,如果对原文使用公钥加密,则只能使用对应的私钥才能解密;因为加密和解密使用的不是同一把密钥,所以这种算法称之为非对称加密算法。

  • 比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人–银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高。
  • 非对称加密算法的密匙是通过一系列算法获取到的一长串随机数,通常随机数的长度越长,加密信息越安全。
  • 通过私钥经过一系列算法是可以推导出公钥的,也就是说,公钥是基于私钥而存在的。但是无法通过公钥反向推倒出私钥,这个过程的单向的。
    在这里插入图片描述

1.2.2、特征

  • 优点:安全,即使密文被拦截、公钥被获取,但是无法获取到私钥,也就无法破译密文。作为接收方,务必要保管好自己的密钥。
  • 缺点:加密算法及其复杂,安全性依赖算法与密钥,而且加密和解密效率很低。

1.3、对称加密和非对称加密区别

对称加密

  • 加密密码和解密密码是相同的密钥

非对称加密

  • 加密密码和解密密码不同
  • 加密和解密算法都是公开的,加密密钥也是公开的,解密密钥是保密的
  • 公钥和私钥是配对关系,公钥加密就用私钥解密

1.4、非对称加密+对称加密的综合利用

对称加密不安全,速度快,非对称加密安全系数高,耗时,如何解决这个问题?

解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。

请看一下这个过程:

  • 1、某网站拥有用于非对称加密的公钥A、私钥A’。
  • 2、浏览器像网站服务器请求,服务器把公钥A明文给传输浏览器。
  • 3、浏览器随机生成一个用于对称加密的密钥X,用公钥A加密后传给服务器。
  • 4、服务器拿到后用私钥A’解密得到密钥X。
  • 5、这样双方就都拥有密钥X了,且别人无法知道它。之后双方所有数据都用密钥X加密解密。

完美?还是有漏洞的。

1.5、中间人攻击

中间人的确无法得到浏览器生成的密钥B,这个密钥本身被公钥A加密了,只有服务器才有私钥A’解开拿到它呀!然而中间人却完全不需要拿到密钥A’就能干坏事了。

  • 1、某网站拥有用于非对称加密的公钥A、私钥A’。
  • 2、浏览器向网站服务器请求,服务器把公钥A明文给传输浏览器。
  • 3、中间人劫持到公钥A,保存下来,把数据包中的公钥A替换成自己伪造的公钥B(它当然也拥有公钥B对应的私钥B’)。
  • 4、浏览器随机生成一个用于对称加密的密钥X,用公钥B(浏览器不知道公钥被替换了)加密后传给服务器。
  • 5、中间人劫持后用私钥B’解密得到密钥X,再用公钥A加密后传给服务器。
  • 6、服务器拿到后用私钥A’解密得到密钥X。
  • 总结:中间人得到了密钥B。根本原因是浏览器无法确认自己收到的公钥是不是网站自己的

如何证明浏览器收到的公钥一定是该网站的公钥? ——》》 数字证书

2、数字签名和数字证书

非常生动的漫画说明

2.1、数字签名(Digital Signature)

2.1.1、定义

网站在使用HTTPS前,需要向“CA机构”申请颁发一份数字证书,数字证书里有证书持有者、证书持有者的公钥等信息,服务器把证书传输给浏览器,浏览器从证书里取公钥就行了,证书就如身份证一样,可以证明“该公钥对应该网站”。然而这里又有一个显而易见的问题了,证书本身的传输过程中,如何防止被篡改?即如何证明证书本身的真实性?

  • 我们把证书内容生成一份“签名”,比对证书内容和签名是否一致就能察觉是否被篡改。这种技术就叫数字签名

1、制作数字签名流程

明文信息 ——》 进行hash(SHA1) ——》 得到摘要(Digest) ——》 使用私钥摘要(Digest) 加密 ——》 明文 和 数字签名 组成 签名结果

注意,这里对摘要进行简单说明:

所谓摘要,其实就是某种HASH算法。将信息明文转化为固定长度的字符,它具有如下特点:

  • ①无论输入的消息有多长,计算出来的消息摘要的长度总是固定的;
  • ②用相同的摘要算法对相同的消息求两次摘要,其结果必然相同;
  • ③一般地,只要输入的消息不同,对其进行摘要以后产生的摘要消息也几乎不可能相同;
  • ④消息摘要函数是单向函数,即只能进行正向的信息摘要,而无法从摘要中恢复出任何的消息;
  • ⑤好的摘要算法,没有人能从中找到“碰撞”,虽然“碰撞”是肯定存在的。即对于给定的一个摘要,不可能找到一条信息使其摘要正好是给定的。或者说,无法找到两条消息,是它们的摘要相同。
  • 目前主要的摘要算法有MD5和SHA1

为什么制作数字签名时需要hash一次?

前面我们已经说了非对称加密效率较差,证书信息一般较长,比较耗时。而hash后得到的是固定长度的信息(比如用md5算法hash后可以得到固定的128位的值),这样加密解密就会快很多。

2.1.2、图解说明

以下图说明为例:假设有一天,Alice收到了一份署名为Bob的文件。Alice希望能够确认这份文件一定是来自Bob;另外Alice希望能够确信,这份文件在传输过程中并没有被它人篡改。那么基于非对称密钥算法我们应该怎么做?
在这里插入图片描述

1、数字签名的制作过程:
① Bob将原始的信息(明文)进行一次信息摘要算法(hash),得到原始信息的摘要

② Bob使用自己的私钥,对该摘要值进行加密。得到信息摘要的密文(数字签名);

③ Bob将明文数字签名一起发送给Alice。

④ 一般的,我们将原始文件(明文)和数字签名 称作Bob对原始文件的签名结果。

2、验证过程

在这里插入图片描述

① 当Alice接收到Bob传输的信息(原始文件,信息摘要密文)后,使用Bob的公钥将摘要密文解密,得到摘要
② 对明文使用信息摘要算法(hash),获取摘要

③ Alice比较解密后的摘要信息和取得的摘要信息。如果相同,则可以证明文件一定由Bob发送,并且中途并没有经过任何篡改。一般将这个过程称作验签

问题发现:

复杂的情况出现了。有人想欺骗Alice,他偷偷使用了Alice的电脑,用自己的公钥换走了Bob的公钥。此时,Alice实际拥有的是骗子的公钥,但是还以为这是Bob的公钥。因此,骗子就可以冒充Bob,用自己的私钥做成“数字签名”,写信给Alice,让Alice用假的Bob公钥进行解密。

Alice感觉不对,发现自己无法确定公钥是否真的属于Bob。她想到了一个办法,要求Bob去找“证书中心”(certificate authority,简称CA),为公钥做认证。证书中心用自己的私钥,对Bob的公钥和一些相关信息一起加密,生成“数字证书”(Digital Certificate)

2.1.2、作用

  • 确认核实发送者
  • 保证报文的完整性
  • 一般用于验证数字证书

2.2、数字证书(Digital Certificate)

2.2.1、定义

网站在使用HTTPS前,需要向“CA机构”申请颁发一份数字证书,数字证书里有证书持有者证书持有者的公钥等信息,服务器把证书传输给浏览器,浏览器从证书里取公钥就行了,证书就如身份证一样,可以证明“该公钥对应该网站”。
在这里插入图片描述
Alice收信后,用CA的公钥解开数字证书,就可以拿到Bob真实的公钥了,然后就能证明“数字签名”是否真的是Bob的。
在这里插入图片描述

2.2.2、数字证书验证过程(和2.1.2节类似)

  • 拿到证书,得到明文T数字签名S
  • CA机构的公钥对S解密,得到S’。(由于是浏览器信任的机构,浏览器保有它的公钥,操作系统、浏览器本身会预装一些它们信任的根证书,如果其中有该CA机构的根证书,那就可以拿到它对应的可信公钥)
  • 用证书里说明的hash算法明文T进行hash得到T’。
  • 比较S’是否等于T’,等于则表明证书可信。

参考

1、https://zhuanlan.zhihu.com/p/49494990
2、https://blog.csdn.net/hmxz2nn/article/details/91394256
3、https://zhuanlan.zhihu.com/p/43789231
4、https://www.jianshu.com/p/4932cb1499bf
5、https://www.cnblogs.com/MicroHeart/p/9057189.html
6、http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

猜你喜欢

转载自blog.csdn.net/JMW1407/article/details/107550256