首先http(超文本传输协议)是不安全的,因为它通过明文对数据进行传输。
那么问题来了,怎么改进呢?(一步步来)
1 对称加密:
在发送真实数据之前,服务器先生成一把密钥,并给客户端,之后服务器再给客户端传输的时候会通过秘钥对数据进行加密。
客户端收到加密的数据后通过密钥进行解密。
特点:效率高,不安全(服务端给客户端的密钥被中间人劫取后,那么就可以对之后劫取得任意加密数据进行解密)。
2 非对称加密
服务端和客户端都拥有两把钥匙,一把公钥、一把密钥。我们拿服务器给客户端传数据为例:服务端拿客户端的公钥对数据进行加密,客户端收到后,通过自己的密钥进行解密。客户端给服务端传数据同理。
特点:相对安全,效率低(非对称加密要比对称加密慢上百倍)
3: 对称加密 + 非对称加密
这个方法应该说是上两个的优化。实现:用非对称加密来加密对称加密的密钥。例: 服务器用明文给客户端发送自己的公钥,客户端收到公钥后生成一把密钥(用于对称加密),然后用服务器的公钥对这把密钥进行加密,之后再把密钥传给服务器,服务器收到了进行解密,然后服务器就得到了这把密钥了。而客户端也有一把密钥,就可以进行对称加密了。(这里我做了个颜色区分,蓝色的就是对称加密的密钥,红色的就是非对称加密的公钥和密钥。这样应该好理解一点)。
那么问题来了:这样就是安全吗?
如果在服务端给客户端提供密钥的时候被中间人劫取,然后中间人把自己的公钥发给客户端,客户端拿到劫取人的公钥生产一个对称加密的密钥,然后劫取人的公钥对这个密钥进行加密,发给劫取人(发给服务端的时候又被劫取人劫取),劫取人就可以用自己的密钥解密的到了对称加密的密钥。那么就跟对称加密效果一样了。
问题出在哪?
很显然,问题就出在客户端不知道拿到的这个公钥是不是服务器给的。
怎么办呢?
数字证书!
上面的问题出在不知道得到的公钥是不是服务端的。那么我们就需要找一个可靠的、大家认可的认证中心(CA)。
服务器在给客户端传输公钥的过程中,会把服务器的个人信息和公钥通过hash算法生产摘要信息。为了防止摘要被人劫取,服务器还会用CA提供的私钥对摘要信息进行加密形成数字签名。然后服务器将摘要信息和数字签名一并(数字证书)发给客户端。当客户端拿到数字证书后,通过CA的公钥对数字证书进行解密的到摘要信息,然后对数字证书里服务器的公钥以及个人信息进行hash计算得到另一个摘要信息。然后两个摘要信息对比是否一样。如果一样就证明是服务器,否则不是。
这样,就确保了服务器的公钥安全交给客户端了。