https简述
在了解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 | (原文) ^ (p) mod N = 密文 |
p和q就是我们说的公钥和密钥,我们可以发现,公钥和密钥事实上是可以互换的,我们可以公钥加密,私钥解密,也可会反过来私钥加密,公钥解密。
与此同时,通过上面的说明,我们可以发现,拥有公钥的一方如果解密了密文,同时拥有原文和密文,也是几乎不可能解出私钥的。
https的原理
https即在http之上添加一个tls层,目前常用的tls版本为1.2版本。
https加密过程
加密过程分为两个阶段:
- 第一阶段是TLS四次握手,双方交换一些信息,最后会得到一个
会话密钥
- 第二阶段是双方利用
会话密钥
通信
我们先来看看TLS四次握手的过程
第一次握手:
客户端发送给服务端:TLS版本+加密套件+客户端随机数
第二次握手:
服务端发送给客户端:TLS版本+服务器证书+服务端随机数
第三次握手:
- 此时客户端再次生成一个随机数,叫做
pre_master_key
,从服务器证书中取出公钥,用公钥加密pre_master_key
,发送给服务端 - 客户端此时已经拥有三个随机数,客户端随机数+服务端随机数+pre_master_key,客户端会把这三个随机数计算得到一个
会话密钥
,此时客户端通知服务端,后面会采用这个会话密钥进行通信 - 客户端会把迄今为止的所有通信内容生成一个摘要,用
会话密钥
加密发给服务器校验,客户端这边的握手流程到这里就结束了,因此也叫做Finished报文
第四次握手:
- 服务端通过同样方法把三个随机数计算得到
会话密钥
,此时服务端告诉客户端,后面会用这个会话密钥进行通信。 - 服务端和客户端一样,将迄今为止的通信内容生成一个摘要,发给客户端校验,此时服务端的握手流程也结束了,因此这也是
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公钥会提前预装在操作系统或者浏览器中。
为什么要用三个随机数
因为只生成一个随机数重复的概率比较大,而三个随机数会大大增加会话密钥
的随机度
为什么要给出摘要
避免交流的内容被篡改
整个过程涉及几对公钥和私钥
- 服务器公钥和私钥
- CA公钥和私钥