zoukankan      html  css  js  c++  java
  • 玩转HTTPS与非对称加密

    我们模拟一个服务端和客户端通过网络发消息的演化过程

    第0次 明文传输

    服务端正常通过明文发送消息給客户端,通过网络链路转发,很容易中途被人截获,解析,甚至篡改,导致很多问题。

    可以说明文传输是没有安全可言的,为此发明了加密的密文传输。

    第一次 简单加密传输

     

    服务端传给客户端一个key,之后传的消息都是通过key进行加密后的密文,持有key才能解密看到明文。

    如果没有key则无法解析消息,防止了传输中途被什么人都能解析篡改。

    问题:传输的key也有可能被人截获,截获后这个加密就变成了玩具。只要持有key就可以轻松破解明文,篡改后再通过key加密传给客户端。

    第二次  非对称加密

    服务端保存一个key1,只有自己知道不对外暴露

    服务端传给客户端一个key2,

    服务端发消息通过key1加密,只有key2才能解密,这样即使中途被人截获了key2也只能看 不能篡改,保证了消息的真实性。

    问题: 截获了key2虽然不能篡改但是还是能解析。

    第三次  四把钥匙两个锁

    服务端自己持有key1(私钥)  发一把key2(公钥)给客户端 

    客户端自己持有key3(私钥)  发一把key4(公钥)给服务端

    服务端给客户端发的消息,使用公钥key4加密,只有key3才能解密,而key3只有客户端自己有

    客户端给服务端发的消息,使用公钥key2加密,只有key1才能解密,而key1只有服务端自己有

    通过公钥加密,私钥解密,保证了来回消息都不会被中途解析和篡改

    问题:四把钥匙来回加密解密效率低,能不能就通过一把钥匙就完成加密解密的动作呢?

    第四次  单双钥匙

    客户端有两把钥匙,私钥key3和公钥key4

    服务端有一把钥匙,私钥key1

    客户端先公钥key4传给服务端,服务端通过key4加密,把加密后的key1传给客户端。key1是什么只有key3才能解开,所以只有客户端才能知道

    这样下来服务端与客户端都在中途不泄露的情况下有同一把钥匙key1,通过key1即可完成之后消息的加密解密

    问题:

    中间人越来越聪明,自己搞了两把钥匙key6(公钥), key5(私钥)

    在客户端传key4给服务端的途中,把key4截获,篡改成自己的key6传给服务端

    服务端用key6把自己key1传过去也被中间人截获,中间人随随便便通过自己的key5解析出key1,然后将自己的key5伪装成key1传给客户端。

    这样下来以后服务端通过key1加密的消息,中间人持有key1解析篡改,再通过自己的key5加密发给客户端。

    客户端通过key5加密的消息,中间人持有key5解密篡改,在通过key1加密后发给服务端。在两边浑然不知的情况下形成了完美闭环 夺笋啊!

    第五次  找CA做公证

    仔细想上面的问题在于第一次客户端传给服务端的key4被人篡改了,如果这个key4能安全送到服务端,就能破解中间人问题

    此时有一个地方叫CA,就是专门派来保护key4的

    CA有两把钥匙 私钥key7,公钥key8  

    客户端会将key4直接发到CA,让CA的key7进行加密后转发,转发给服务端

    那么服务端通过key8一解析就能完好无损的拿到key4了。

    这样即使中间人截获后通过key8解密出key4也没办法篡改,因为中间人没有key7加密,篡改后的钥匙服务端key8解不开。

    保证了key4的安全就保证了key1传输的安全,就保证了服务端客户端各持有key1加解密消息的安全 

    finally

    公钥加密 私钥解密,这个叫 "加密",就是客户端的key3 key4玩法

    私钥加密 公钥解密,这个叫 "签名",就是CA机构的key7 key8玩法

    HTTPS 的原理就是用非对称加密的方式来交换秘钥,用对称加密的方式来通信,然后里面夹杂着哈希算法用于验证签名

    over

  • 相关阅读:
    jQuery-1.9.1源码分析系列(九) CSS操作
    jQuery-1.9.1源码分析系列(八) 属性操作
    jQuery-1.9.1源码分析系列(七) 钩子(hooks)机制及浏览器兼容续
    由一次虚拟内存耗尽看32bits elf在x86_64下运行方式及地址空间布局
    关于TCP关闭想到的一些问题
    pure virtual method called的一种情况
    linux下内存分配时overcommit使用
    gcc对C++局部静态变量初始化相关
    为什么cat binary之后可能出现乱码
    gcc的模版匹配及其它
  • 原文地址:https://www.cnblogs.com/ttaall/p/15658823.html
Copyright © 2011-2022 走看看