这里会循序渐进的讲解:明文传输、对称加密、非对称加密、结合对称非对称加密、CA证书授权。
https为了保证安全性以及效率,采取的措施:非对称加密、对称加密,、CA。
这里参考的网址:HTTPS原理全解析。
2. 明文传输 传输过程如下图: 可以看到黑客很容易截取我们的请求,导致传输的数据泄露,因此不可取。 3. 对称加密 对称加密需要两个函数:加密函数 f1,解密函数f2,同时还需要一个秘钥K,对于给定数据data,有:f 1 ( K , d a t a ) = X f 2 ( K , X ) = d yjddn_1(K, data) = X \ f_2(K, X) = data f1(K,data)=Xf2(K,X)=data
此时我们传输密文X即可,传输过程如下:这样其实也是存在问题的。
首先,服务端不可能存储和所有客户端对应的K,一方面十分浪费空间,另一方面服务端实现也不知道哪些客户端会连接。因此服务端可以保存一个K。
那这样黑客也可以作为客户端获取这个K,这样别的客户端和服务端通信的数据也可以被黑客解密,因此不安全。
4. 非对称加密非对称加密最常见的是RSA,关于该加密算法请参考:RSA公钥加密算法。
加密解密需要一个函数f,同时需要公钥PK,私钥SK,对于给定数据data,有:
f ( P K , d a t a ) = Y f ( S K , Y ) = d a t a f ( S K , d a t a ) = Y ′ f ( P K , Y ′ ) = d yjddn(PK, data) = Y \ f(SK, Y) = data \ f(SK, data) = Y' \ f(PK, Y') = data f(PK,data)=Yf(SK,Y)=dataf(SK,data)=Y′f(PK,Y′)=data
这种方式也存在问题。
客户端给服务端发送的数据Y是用公钥进行加密的,因此只有服务端可以解密。但是服务端给客户端发送的数据不能使用公钥加密,因为客户端没有私钥,无法还原数据,因此服务端只能使用私钥加密,这样的话Y'可以被黑客解密,因为公钥是公开的,不安全。
解决办法之一:客户端也存储自己的公钥、私钥,将自己的公钥发给服务端,服务端使用客户端的公钥进行加密,这样也能保证服务端向客户端发送数据的安全性了。这样其实也是不可取的,原因有两点:
(1)但是非对称加密计算量太大;
(2)存在中间人问题。
5. 结合对称、非对称加密使用非对称加密、对称加密两种方式确保数据安全传输。分为两个阶段:
(1)使用非对称加密协商之后对称加密需要的K;
(2)使用对称加密进行传输数据。
流程图如下:
这种方式的话,第(1)步黑客无法获知K,并且每个客户端和服务端都可以协商属于该连接的K,看似十分安全了,但是还是存在问题:中间人问题,如下图: 可以看到中间通信过程都被黑客劫持了,黑客可以获得协商的K,因此黑客可以获取通信双方的任何信息。 6. CA证书授权CA:全称Certificate Authority,是一个机构,这个机构负责给网站颁发证书。
CA会有一系列安全的CPK、CSK,一个网站服务端有自己的PK、SK,网站的PK通过CSK进行加密得到网站的license,即:
f ( C S K , P K ) = l i c e n s e f(CSK, PK) = license f(CSK,PK)=license
这个证书license会保存在服务端,CA的目的就是保证证书不会被被中间的黑客篡改,如果被中间人(黑客)篡改的话,这个中间人(黑客)还需要向CA机构认证。
CA的原理就是利用了非对称加密的应用:私钥签名。
这样整个传输过程如下(参考网址):
客户端本地存储的有机构的公钥,这样就可以防止公钥被黑客篡改,加上私钥签名,确保了license的可靠性,cmd中输入certmgr.msc可以查看本地公钥,如下图:保留了证书的安全性之后,我们就可以得到正确的服务器端公钥,然后将会话秘钥使用该公钥加密传输给服务端,即使中间被劫持黑客也不能解密,因为秘钥只在服务端存在。
之后通过会话秘钥(对称加密)就可以传输数据了。
这种方式既保证了安全性,同时最后传输使用对称加密,降低了计算量。