认真地理解 Https

Posted by syea on February 1, 2018

普通 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 了~ 🏔🏔🏔

最后的思考

  1. 为什么Charles还是能窃取 https 的内容

    使用charles抓https包的时候,需要在手机上安装charles证书并且信任该证书, 这时候charles就可以

    1. 拦截服务器的证书,把自己的证书的公钥发给客户端
    2. 客户端误将charles的公钥加密后传向服务器
    3. 拦截客户端请求,用自己的公钥解密后,用刚才拦截的服务器公钥加密,传回服务器
    4. boom~

    安装并信任charles证书,是用户主动的操作,也可以说是用户主动泄密的结果。 如果用户不信任该charles证书,那么数据就不会被传输,连接会被直接中断。所以https还是安全的协议。

  2. 为什么不直接用非对称加密,加密内容,而要去加密密钥,再去解密一次

    因为非对称加密慢,对称加密快呀~

  3. 中间人虽然看不懂请求内容,但是他瞎改怎么办

    可以瞎改,但是数据到了服务器不会被正确解析,也就没什么用了

  4. 如何保证公钥的正确性

    CA证书是由权威机构颁发(意味着你可以信任他),证书的内容包含多种信息,其中就包括服务器的公钥,还包括证书有效期等等。 通过它建立我们的信任基点,就可以保证服务器公钥被正确的传递给浏览器,然后浏览器可以使用它安全的把对称加密的密钥传递给服务器,之后以此密钥加密需要传递的信息,保证了数据的安全性。

    这个公钥不用传输,会直接内置在各大操作系统(或者浏览器)的出厂设置里。之所以不把每个服务器的公钥内置在电脑里,一方面是因为服务器太多,存不过来。另一方面操作系统也不信任你,凭什么你说你这个就是百度/淘宝的证书呢? 所以各个公司要先去权威机构认证,申请证书,然后操作系统只会存储权威机构的公钥。因为权威机构数量有限,所以操作系统厂商相对来说容易管理。如果这个权威机构不够权威,XJB 发证书,就会取消他的资格,比如可怜的沃通。。。。

本篇引用:

  1. 百度百科
  2. 《Https的前世今生》
  3. 《九个问题从入门到熟悉HTTPS》