HTTP 协议内容都是按照⽂本的⽅式明⽂传输的,这就可能导致在传输过程中出现⼀些被篡改的情况。所以在HTTP协议的基础上,引入加密层,形成了HTTPS协议。
HTTPS 协议是由 HTTP 加上 TLS/SSL 协议构建的可进行加密传输、身份认证的网络协议,主要通过数字证书、加密算法、非对称密钥等技术完成互联网数据传输加密,实现互联网传输安全保护。设计目标主要有三个。
(1)数据保密性:保证数据内容在传输的过程中不会被第三方查看。就像快递员传递包裹一样,都进行了封装,别人无法获知里面装了什么。
(2)数据完整性:及时发现被第三方篡改的传输内容。就像快递员虽然不知道包裹里装了什么东西,但他有可能中途掉包,数据完整性就是指如果被掉包,我们能轻松发现并拒收。
(3)身份校验安全性:保证数据到达用户期望的目的地。就像我们邮寄包裹时,虽然是一个封装好的未掉包的包裹,但必须确定这个包裹不会送错地方,通过身份校验来确保送对了地方。
这里解释一下一些概念关于加密的概念:
对称加密:也称单密钥加密,加密和解密所⽤的密钥是相同的。
非对称加密:分为公钥和私钥,公钥加密只能用私钥解密,私钥加密只能用公钥解密。
数据摘要:又称数字指纹,基本原理是利⽤单向散列函数(Hash函数)对信息进⾏运算,⽣成⼀串固定⻓度的数字摘要。数字指纹并不是⼀种加密机制,但可以⽤来判断数据有没有被窜改。
想象一下如果在你和服务器之间存在一个中间人,你和服务器为了保证数据安全,都要对数据加密后再发送。那么通信的双方就必须知道解密的密钥。
场景1:只使用对称加密
你和服务器都有一个你俩才知道到的密钥,这当然可以保证数据安全。但是服务器显然不会只和你交互,那么服务器就必须维护大量密钥与客户端的关联关系,这显然十分麻烦。所以在通信之前就要协商这次通信的密钥是什么,但是发送密钥(密钥也是一种数据)的过程也需要加密,否则中间人获取到你加密过的密钥,照样可以破获你的数据。但是这样就陷入了无限轮回。
场景2:只使用非对称机密
服务器把公钥发送给客户端,客户端用公钥加密后把数据发送给服务器,由于中间人没有私钥自然无法破解密文,但是服务器向客户端发送的信息是用私钥加密的,中间人完全可以在客户端获得公钥之前截取公钥,在服务器给客户端返回消息的时候用公钥破解数据,这样的话还是不安全。
场景3:双方都是用非对称加密
服务器拥有公钥S1和私钥S2,客户端也拥有公钥C1和私钥C2。在通信前,互相发送各自的公钥,然后用各自的私钥加密信息,这样即便中间人截取了数据由于私钥S2和C2在服务器或客户端那里,自然无法解密。但是如果中间人在双方互换公钥之前就已经截取到信息了,然后对其做出修改,比如中间人也有公钥A1和私钥A2,把服务器给客户端的S1换成他自己的A1,然后客户端用A1加密后,把数据发给服务器,中间人就可以用自己的私钥A2解密,然后再用截取到的S1加密数据后发送给服务器。这时候服务器和客户端还傻呵呵乐呢,实际上并不安全。
场景4:非对称加密+对称加密
服务器使用非对称加密,拥有公钥S1和私钥S2。客户端使用对称加密,拥有唯一的密钥C。当进行通信前,服务器把公钥S1发送给客户端,客户端使用S1加密密钥C后发送给服务器,之后双方就可以使用单密钥C通信了。这样理论上是安全的。但是如果中间人在客户端接收公钥S1之前就蹲点了呢?把S1换成中间人自己的密钥A呢?客户端利用密钥A加密密钥C然后发给服务器,被中间人截获后,解密不就获得密钥C了。这样之后的通信相当于全部暴露到了中间人眼皮下,跟裸奔没啥区别。
所以上面的场景2,3,4都犯了一个错误那就是通信前发送公钥无法加密,会被截取。为了避免这种情况,就引入了证书。