一、HTTP 存在的问题
1.HTTP 报文使用明文方式发送,可能被第三方窃听。
2.HTTP 报文可能被第三方截取后修改通信内容,接收方没有办法发现报文内容的修改。
3.HTTP 还存在认证的问题,第三方可以冒充他人参与通信。
二、HTTPS 简介
HTTPS 指的是超文本传输安全协议,HTTPS 基于 HTTP 协议的,并使用 TLS/SSL 来对数据加密。
1.使用 TLS/ SSL 协议,所有的信息都是加密的,第三方没有办法窃听。
2.提供了一种校验机制,信息一旦被篡改,通信的双方会立刻发现。
3.配备了身份证书,防止身份被冒充的情况出现。
三、实现原理
HTTPS主要用到了三个方法来保证传输的安全。
-
首先是对称加密的方法,对称加密的方法是,双方使用同一个秘钥对数据进行加密和解密。但是对称加密的存在一个问题,就 是如何保证秘钥传输的安全性,因为秘钥还是会通过网络传输的,一旦秘钥被其他人获取到,那么整个加密过程就毫无作用了。 这就要用到非对称加密的方法。
-
非对称加密的方法是,我们拥有两个秘钥,一个是公钥,一个是私钥。公钥是公开的可以直接传,私钥是保密的用于解密我们的公钥。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密。比如:我们可以将公钥公布出去,任何想和我们通信的客户, 都可以使用我们提供的公钥对数据进行加密,并将加密后的数据返回给我们,这样我们就可以使用我们自己的私钥在对其进行解密,这样就能保证数据的安全了。但是非对称加密有一个缺点就是加密的过程很慢,因此如果每次通信都使用非对称加密的方式的话,反而会造成等待时间过长的问题。(因为每次传输数据都用的非对称加密方式,故每次都很慢)
-
因此我们可以使用对称加密和非对称加密结合的方式,因为对称加密的方式的缺点是无法保证秘钥的安全传输,因此我们可以用非对称加密的方式传输对称加密所需的的秘钥,然后以后的通信使用对称加密的方式来加密和解密,这样就解决了两个方法各自存在的问题。(因为只有第一次传输秘钥用的非对称加密方式,后面是用的对称加密方式进行数据传输,故只有一次很慢)
-
但是没有办法确定我们得到的非对称加密里的公钥就一定是安全的公钥。可能存在一个中间人,截取了对方发给我们的公钥,然后将他自己的公钥发送给我们,当我们使用他的公钥加密后发送的信息,就可以被他用自己的私钥解密。然后他伪装成我们以同样的方法向对方发送信息,这样我们的信息就被窃取了,然而我们自己还不知道。
-
为了解决这样的问题,我们可以使用数字证书的方式,首先我们使用一种 Hash 算法来对我们的公钥和其他信息进行加密生成一个消息摘要,然后让有公信力的认证中心(简称 CA )用它的私钥对消息摘要加密,形成签名。最后将原始的信息和签名合在一起,称为数字证书。当接收方收到数字证书的时候,先根据原始信息使用同样的 Hash 算法生成一个摘要,然后使用公证处的公钥来对数字证书中的消息摘要进行解密,最后将解密的消息摘要和我们生成的消息摘要进行对比是否一致,就能发现我们得到的信息是否被更改了。这个方法最要的是认证中心的可靠性,即信任CA公钥,一般浏览器里会内置一些顶层的认证中心的证书,相当于我们自动信任了他们,只有这样我们才能保证数据的安全。可用下图理解数字证书的方式:
四、实现原理图解
可参考:《一个故事讲完 https》《分分钟让你理解 HTTPS》
总结: (以下通信双方,发送消息方称为客户端,接受消息方称为服务器端)
- 首先客户端和服务器使用对称加密的方式进行消息传输,即双方使用同一个秘钥对数据进行加密和解密。
- 其次,第一次得先传递该秘钥(直接传还是不安全),故采用非对称的方式进行传递,即服务器端发送一个自己的公钥给客户端,客户端用该公钥加密自己的秘钥,并将加密后的秘钥返回给服务器端,服务器端用自己的私钥来解密该加密后的秘钥得到原秘钥(因为公钥和秘钥都是自己的)。
- 随后,但是服务器发送的公钥,对于客户端也并不能保证其安全性,可能出现被中间人截取,故该公钥采用数字证书的方式给客户端进行验证,验证正确后才有“其次”后的“客户端用公钥加密自己的秘钥...”。
五、TLS 握手过程
第一步,客户端向服务器发起请求,请求中包含使用的协议版本号、生成的一个随机数、以及客户端支持的加密方法。
第二步,服务器端接收到请求后,确认双方使用的加密方法、并给出服务器的证书、以及一个服务器生成的随机数。
第三步,客户端确认服务器证书有效后,生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,然后发给服 务器。并且还会提供一个前面所有内容的 hash 的值,用来供服务器检验。
第四步,服务器使用自己的私钥,来解密客户端发送过来的随机数。并提供前面所有内容的 hash 值来供客户端检验。
第五步,客户端和服务器端根据约定的加密方法使用前面的三个随机数,生成对话秘钥,以后的对话过程都使用这个秘钥 来加密信息。