在了解https之前,我们先来了解一下非对称加密。

非对称加密的数学原理

非对称加密,就是加密和解密用到的不是一个密钥,一般来说,我们用公钥加密,私钥解密。

下面我们来介绍非对称加密的数学原理,我们来举一个简单的例子:

1
5 ^ 2 mod 7 = 25 mod 7 = x

易知x = 4,然后,我们将x的位置切换

1
5 ^ x mod 7 = 4

我们通过枚举,似乎也可以得到答案,x = 2,但是如何模数字变得很大呢?

1
5 ^ x mod 56374677648 = 4

此时的计算量会变得非常巨大,即使是计算机也要花费数年的时间才能计算得出,我们可以认为这是无法计算的。

上面的计算我们可以认为就是将5(原文)加密成了4(密文),我们在已知x的情况下,很容易就可以加密,但是反之,我们在仅知道5(原文)和4(密文)的情况下,我们很难推出x的值,我们认为这是一个不可逆的过程。

那么,我们接下来把x分成p和q

1
5 ^ (p * q) mod 56374677648 = 4

也就是

1
(原文) ^ (p * q) mod N = 密文

接下来,最重要的一步是结合欧拉公式,可以得到

1
2
(原文) ^ (p) mod N = 密文
(密文) ^ (q) mod N = 原文

p和q就是我们说的公钥和密钥,我们可以发现,公钥和密钥事实上是可以互换的,我们可以公钥加密,私钥解密,也可会反过来私钥加密,公钥解密。

与此同时,通过上面的说明,我们可以发现,拥有公钥的一方如果解密了密文,同时拥有原文和密文,也是几乎不可能解出私钥的。

https的原理

​ https即在http之上添加一个tls层,目前常用的tls版本为1.2版本。

https加密过程

6401

加密过程分为两个阶段:

  1. 第一阶段是TLS四次握手,双方交换一些信息,最后会得到一个会话密钥
  2. 第二阶段是双方利用会话密钥通信

我们先来看看TLS四次握手的过程

640

第一次握手:

客户端发送给服务端:TLS版本+加密套件+客户端随机数

第二次握手:

服务端发送给客户端:TLS版本+服务器证书+服务端随机数

第三次握手:

  1. 此时客户端再次生成一个随机数,叫做pre_master_key,从服务器证书中取出公钥,用公钥加密pre_master_key,发送给服务端
  2. 客户端此时已经拥有三个随机数,客户端随机数+服务端随机数+pre_master_key,客户端会把这三个随机数计算得到一个会话密钥,此时客户端通知服务端,后面会采用这个会话密钥进行通信
  3. 客户端会把迄今为止的所有通信内容生成一个摘要,用会话密钥加密发给服务器校验,客户端这边的握手流程到这里就结束了,因此也叫做Finished报文

第四次握手:

  1. 服务端通过同样方法把三个随机数计算得到会话密钥,此时服务端告诉客户端,后面会用这个会话密钥进行通信。
  2. 服务端和客户端一样,将迄今为止的通信内容生成一个摘要,发给客户端校验,此时服务端的握手流程也结束了,因此这也是Finished报文

在握手结束以后,我们发现客户端和服务端拥有同一个会话密钥,也就是说两者在通信阶段使用的是对称加密而不是非对称加密。

为什么通信阶段要使用对称加密

因为对称加密的速度要快于非对称加密

服务器证书是什么

首先我们可以知道,客户端和服务端发送的随机数都是明文的,所有很容易被获取,关键就在于pre_master_key,那么我们要如何保证这个pre_master_key的安全性呢,关键在于客户端要确保服务器公钥是真正来自服务器的。

如果黑客在这个过程中替换了服务器的公钥,那么我们的pre_master_key将会被截取。那么客户端是如何保证公钥来自服务器呢,实际上如果只依靠服务端和客户端本身,这是一个无解的问题,因为双方在真正加密通信之前,双方是互相不信任的,但是我们又需要一次受信任的通信来开启加密通信(这次受信任的通信建立在服务器和客户端不信任的前提下),在https的加密过程中,这次受信任的通信就是客户端接受服务端的服务证书,从这一次通信过后,客户端可以加密出pre_master_key,这个加密后的pre_master_key只有服务端可以解密,所有客户端可以放心的发送给服务端,之后的过程中,双方的通信都是可以信任的。

这个问题的解决仅仅依赖客户端和服务端两方是不可行的,那么怎么解决双方互相不信任的问题呢,这个时候我们引入一个客户端和服务端都信任的第三方机构**权威数字证书机构(CA)**来解决,CA机构用自己的私钥加密服务器公钥,得到服务器证书,服务器把这个服务器证书发送给客户端,客户端拿着CA的公钥解密服务器证书然后获取服务器公钥,这样就解决了双方不信任的问题,因为客户端对CA机构是信任的,所以客户端会信任由CA私钥加密的服务器证书。

所有服务器证书就是用私钥加密的服务器公钥,当然,这个证书中还有其它内容,包括服务器域名。

如何获取CA公钥

上面我们提到了客户端用CA公钥解密服务器证书获得服务器公钥,那么客户端怎么获得CA公钥呢,我们知道CA是公开的,而CA机构的数量又不是太多,所以这些CA公钥会提前预装在操作系统或者浏览器中。

为什么要用三个随机数

因为只生成一个随机数重复的概率比较大,而三个随机数会大大增加会话密钥的随机度

为什么要给出摘要

避免交流的内容被篡改

整个过程涉及几对公钥和私钥

  1. 服务器公钥和私钥
  2. CA公钥和私钥