前言
我们都知道HTTP
是以明文的形式在网络中传输的,当HTTP
数据包被截获的话,传输的内容被一览无余。所以HTTP
传输是相当不安全的,这就有了HTTPS
协议,它是一种网络安全的传输协议,同样利用HTTP
协议进行通信,但是数据都是进过TLS/SSL
进行过加密的。即使是被非法窃取也只是获得了加密的数据。
相关名词介绍
对称加密
对称加密就是使用同一个密钥对数据进行加密和解密。对称加密的优点是计算量小,计算速度快,计算效率高。但是缺点是双方都持有相同的密钥,安全性得不到保障。常见的对称加密算法有:DES
、3DES
、AES
。
非对称加密
非对称加密与对称加密的不同之处在于非对称加密使用了两种密钥,一种称作公钥,另一种成为私钥。用其中一把密钥加密的数据必须使用另外一种密钥才能解密。在网络传输中,一般服务器保存了私钥,然后将公钥传输给客户端,客户端使用公钥加密数据传给服务器。这样一来其他人都不能解密数据,只有服务器才能解密因为只有服务器拥有私钥。非对称加密的优点是安全性比对称加密更好,缺点是速度慢。常见的非对称加密算法有:RSA
。
消息摘要
HTTPS
保证传输安全还需要保障传输的内容在传输过程中是完好的,是没有被篡改过的。这就需要使用消息摘要算法,服务器使用消息摘要算法会对传输的内容进行哈希,然后将哈希值连同数据一同发送给客户端,客户端使用相同的哈希算法对传输过来的数据进行哈希得到的哈希值与服务器传过来的哈希值对比,如果相同则表明整个数据在传输过程中是完好的。哈希值是不可逆的,由哈希值推导不出原数据的内容。常见的消息摘要算法有:MD5
、SHA
、MAC
。
HTTPS采用的加密技术
前面我们看到了对称加密与非对称加密各有各的优缺点,所以HTTPS
结合了这两种加密方式。在客户端与服务器之间交换密钥时采用非对称加密,在真实传输数据时采用对称加密。为什么客户端和服务器交换密钥采用非对称加密呢?这是因为客户端与服务器在传输通道建立前传输的内容一定是明文的,对称加密使用的是同一种密钥显然是不妥的。而非对称加密中公钥被其他人获知是没有关系的,只要私钥不被获知那么之后的传输内容就是安全的。另需要注意的是服务器必须要有证书,证书其实是用来证明公钥是这个服务器的,防止第三方冒充服务器使用自己的公钥传给客户端。
TLS/SSL握手过程
为了更好地理解整个握手过程,使用Wireshark
抓取与知乎连接过程中传输的数据包。需要注意的是,HTTPS
传输的数据都是加密过的,所以抓取到的(除了握手过程产生的数据包)数据包都是经过了加密的。怎样使得Wireshark
能够解密数据呢?这就用到了Chrome
或者FireFox
浏览器的一个特性。当在系统环境变量中配置SSLKEYLOGFILE
路径后,Chrome/FireFox
就会将Master-Key
写进这个文件中。这个master-key
可以理解为对称加密算法的密钥。有个这个密钥,Wireshark
自然能够解密出数据。配置图如下所示:
下图是在与知乎连接的一次过程中抓取到的数据包:
-
在经过TCP三次握手后客户端发送Client Hello消息到服务器端,其中包括有一个客户端产生的随机数以及客户端支持的加密算法。抓包图如下所示:
-
服务器接收客户端Hello消息后向客户端发送Hello消息,其中包括服务器端生成的随机数,服务器选择的加密算法。
-
服务器端向客户端发送自己的证书,证书中包含自己的公钥。
-
客户端验证证书,证书伪造会立即停止握手。客户端随机生成一个
Pre-Master-Key
,并且用服务器证书中的公钥进行加密后传输给服务器端,客户端使用前面的两个随机值以及Pre-Master-Key
生成Master-key
,也就是对称加密使用的共享密钥,后面传输的数据都会使用这个Master-Key
进行加密。
-
最后服务器端使用自己的私钥解密数据得到
Pre-Master-Key
,以同样的方式生成Master-Key
。后面客户端与服务器通信的数据就使用Master-Key
加密了。