普通 http 发请求
客户端发起请求:
hello world
被中间人劫持篡改:
hi baby
再发送到服务器,服务器收到请求:
hi baby
boom 🌋🌋🌋
对称加密
为了避免上述情况,我们可以用一个密钥对请求内容进行加密
首先了解一下对称加密
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
客户端发起请求:
hello world + 密钥 -> biubiubiu
被中间人看到的内容:
biubiubiu
服务器收到请求:
(biubiubiu + 密钥) -> hello world
但是由于密钥也一起在请求中传了过去,其实还是会被破解信息
客户端发起请求:
hello world + 密钥 -> biubiubiu
被中间人看到的内容:
biubiubiu 拿到密钥解密并篡改 —> abcdefg
服务器收到请求:
(abcdefg + 密钥) -> hi baby
boom again 🌋🌋🌋
非对称加密
为了避免上述情况,我们的方式再高端一点。
首先了解一下非对称加密
非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。 非对称加密与对称加密相比,其安全性更好:对称加密的通信双方使用相同的秘钥,如果一方的秘钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对秘钥,一个用来加密,一个用来解密,而且公钥是公开的,秘钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
服务器端申请 CA 认证,拥有唯一的公钥和私钥。
客户端把上一种方式中的密钥,用服务器公开的公钥进行加密。
客户端发起请求:
hello world + 用公钥加密的密钥 -> biubiubiu
被中间人看到的内容:
biubiubiu 无法破解,因为只有服务器有私钥
服务器收到请求:
(biubiubiu + 私钥解密的密钥) -> hello world
这次是真没办法了,因为中间人没有私钥,没办法解密我们的密钥, 而服务器却可以。
不会再 boom 了~ 🏔🏔🏔
最后的思考
- 为什么
Charles还是能窃取 https 的内容使用charles抓https包的时候,需要在手机上安装charles证书并且信任该证书, 这时候charles就可以
- 拦截服务器的证书,把自己的证书的公钥发给客户端
- 客户端误将charles的公钥加密后传向服务器
- 拦截客户端请求,用自己的公钥解密后,用刚才拦截的服务器公钥加密,传回服务器
- boom~
安装并信任charles证书,是用户主动的操作,也可以说是用户主动泄密的结果。 如果用户不信任该charles证书,那么数据就不会被传输,连接会被直接中断。所以https还是安全的协议。
-
为什么不直接用非对称加密,加密内容,而要去加密密钥,再去解密一次
因为非对称加密慢,对称加密快呀~
-
中间人虽然看不懂请求内容,但是他瞎改怎么办
可以瞎改,但是数据到了服务器不会被正确解析,也就没什么用了
- 如何保证公钥的正确性
CA证书是由权威机构颁发(意味着你可以信任他),证书的内容包含多种信息,其中就包括服务器的公钥,还包括证书有效期等等。 通过它建立我们的信任基点,就可以保证服务器公钥被正确的传递给浏览器,然后浏览器可以使用它安全的把对称加密的密钥传递给服务器,之后以此密钥加密需要传递的信息,保证了数据的安全性。
这个公钥不用传输,会直接内置在各大操作系统(或者浏览器)的出厂设置里。之所以不把每个服务器的公钥内置在电脑里,一方面是因为服务器太多,存不过来。另一方面操作系统也不信任你,凭什么你说你这个就是百度/淘宝的证书呢? 所以各个公司要先去权威机构认证,申请证书,然后操作系统只会存储权威机构的公钥。因为权威机构数量有限,所以操作系统厂商相对来说容易管理。如果这个权威机构不够权威,XJB 发证书,就会取消他的资格,比如可怜的沃通。。。。
本篇引用: