zoukankan      html  css  js  c++  java
  • HTTPS详解

    一、为什么会有HTTPS

    1、HTTP协议不安全

      http协议是明文传输的,比如我们往服务器发送比较隐私的数据(银行卡、密码等),数据在传输的过程中可能被中间人抓包拿到,重要的信息会被窃取,中间人还可能将数据修改或替换后发往服务器,而服务器确定数据是否被修改,也无法判断数据真的来源于客户端

    2、HTTP协议的弊端

      存在三个弊端:无法保证消息的保密性,无法保证消息的完整性和准确性,无法保证消息来源的可靠性

      HTTPS就是为了解决上述问题而产生的

    二、HTTPS是什么

    1、SSL/TLS

      先说一下SSL和TLS协议,上世纪90年代中期网景公司为了解决HTTP因为明文传输产生的上述问题,发明了SSL协议,通过加密的方式保证通信的安全,IETF在99年将SSL协议标准化并改名为TLS协议,所以现在一般将他们并列称呼为SSL/TLS 

    2、HTTPS

      HTTPS其实不算是一种协议,它其实是HTTP协议和SSL/TLS协议的组合,在原先应用层HTTP和传输层TCP之间加了一层处理加密信息的模块,服务端和客户端的信息传输都会被加密

    三、HTTP如何实现加密传输

    1、加解密算法

       主流的加密解密算法主要有两种:对称加密算法和非对称加密算法

       对称加密算法也叫共享密钥加密,对数据的加密和解密使用同一个密钥,性能较好,常用的有:DES、AES、3DES、TDEA、Blowfish、RC5、IDEA等

      非对称加密算法也叫公开密钥加密,密钥成对出现,分为公钥和私钥,不能相互推导,公钥加密需要私钥解密,私钥加密需要公钥解密,常用的有:RSA、DSA、ECC、ElGamal等

    2、HTTPS的设计难点

      服务器和客户端之间想要实现加密数据传输,就先要有一致的密钥,并且不能让第三方窥探到密钥信息,如何在HTTP协议的明文传输下实现密钥的交换是HTTPS的设计难点

      另一个关键点是身份认证机制,后面说

    3、只使用对称加密算法来实现

      客户端和服务器之间通过明文传输密钥,很容易会被攻击者偷窥到,无法进行安全的密钥交换,接下来加入非对称加密算法

    4、使用非对称加密算法来做到密钥交换

      第一步:服务器生成一对密钥:私钥k1和公钥k2

      第二步:服务器把公钥k2用明文的方式发送给客户端,虽然明文会被攻击者看到,但是攻击者无法通过公钥k2推导出私钥k1

      第三步:客户端拿到k2后,随机生成一个对称加密的密钥k3,然后用拿到的公钥k2加密k3得到k3',客户端将k3'发送给服务端,因为公钥加密只有私钥才能解密,所以攻击者无法通过公钥k2解密k3'

      第四步:服务器拿到k3'后,用私钥k1解密得到密钥k3,到目前为止服务器和客户端完成了密钥交换,双方都知道k3,可以使用k3来加密数据进行双向传输,而攻击者似乎无法得到密钥k3

    5、中间人攻击

      使用非对称加密和对称加密的混合方案完成了密钥交换,在第四步交换时攻击者无法偷窥到密钥k3信息,但是在第二步明文传输公钥k2时攻击者可以截获信息并篡改公钥,服务端无法辨别公钥是否真的来自于客户端,缺少了身份认证这一步

      MITM中间人攻击步骤:

      第一步:服务器生成一对密钥:私钥k1和公钥k2

      第二步:服务器把公钥k2用明文的方式发送给客户端,攻击者截获k2,保留起来,同时生成自己的一对密钥:私钥pk1和公钥pk2,将公钥pk2发送给客户端

      第三步:客户端拿到pk2后,随机生成一个对称加密的密钥k3,然后用拿到的公钥pk2加密k3得到k3',客户端将k3'发送给服务端,攻击者再次截获k3',因为k3'是攻击者的pk2公钥生成的,所以攻击者可以用pk1私钥解密,得到关键的密钥k3,之后用最开始从服务端截获的k2加密k3,得到k3'发送给服务端

      第四步:服务端拿到k3'后,用私钥k1解密得到密钥k3,并没有发现不对,然后服务端和客户端之间加密的数据都可以被攻击者用密钥k3解密了

      

      

    6、用CA证书实现身份认证

      使用非对称加密和对称加密的混合方案唯一的问题是在第二步传输公钥的时候没有进行身份认证,所以最后HTTPS引入了CA证书的机制来实现身份认证

      CA是证书授权中心的意思,CA证书就是CA机构颁发的数字证书

      证书有信任链的概念,信任链是树状结构,根证书是全球少有的几家顶级CA机构给自己颁发的证书,是信任链的起点,只要当前证书的最末端是可信的根证书,当前证书就是可信的

      服务端可以向CA机构申请证书,先生成一对密钥,然后带上自己的相关信息(服务器公钥、企业信息等)提交申请,CA机构会将这些信息通过hash算法加密后得到摘要,再用CA机构自己的私钥加密这段摘要得到数字签名,最后将数字签名和服务器公钥整合生成数字证书颁发给服务端

      注:有一些金融机构的内网会要求HTTPS双向认证,客户端也要具备证书,才可以访问到服务端的数据

     7、加入CA证书机制保护密钥交换

      第一步:不变

      第二步:服务器向客户端发送CA证书

      第三步:客户端用CA机构的公钥解密数字签名(浏览器和操作系统中会内置权威CA机构的根证书,证书中含有公钥,根证书的公钥对子集证书都适用),解密后拿到摘要,客户端再用和CA机构一样的hash算法将证书中的申请信息生成一份摘要,如果两份摘要一致说明证书未被篡改,最后客户端就可以放心使用CA证书中含有的服务端公钥了,之后的步骤一样

    8、更多的密钥交换算法

      前面例子里是通过RSA这种非对称加密算法来交换密钥的,也可以使用DH算法和其衍生算法这种专门的密钥交换算法,还可以使用PSK和SRP这种依赖双方约定好内容来生成密钥的算法

      DH算法和RSA的不同之处在于RSA需要传递公钥加密的密钥而DH传递的只是2个用于加密的参数,相对安全一些,但是DH算法只能防止偷窥,不能防止篡改,也就是还是需要搭配RSA、DSA、ECDSA这些签名算法来帮忙实现身份认证

      ECDH是DH算法的变种,数学原理基于椭圆曲线,比DH更难破解

      PSK算法依赖于通讯双方已经预先部署了若干共享的密钥,协商密钥的过程中交换的是密钥的id,它和RSA很像,既可以做密钥交换,也可以做身份认证,所以也可以和DH一家组合使用

      SRP算法和PSK类似,只是预先部署的不是密钥而是密码

    9、回溯性破解和向前保密/完美正向加密(PFS)

      前面几种密钥交换方案可行是建立在攻击者无法拿到私钥的情况下的,在一些极端的情况下攻击者还是有可能拿到私钥的,比如服务器操作系统被入侵、协议的设计漏洞、基于协议实现的漏洞、国家要求交出私钥..

      前面说的几种算法都容易遭受到回溯性破解,而能够对抗回溯性破解的算法被称为向前保密/完美正向加密(PFS)

      如果要求DH算法的通讯双方每次都生成随机的密钥,当次用完后丢弃,攻击者就难以破解过往的历史数据,这种改良后的DH算法叫做DHE算法,类似的ECDH算法也可以改良为ECDHE算法,来对抗回溯性破解

      如图在最新的TLS1.3协议中就抛弃了做不到PFS的算法

      

    四、HTTPS握手过程

    五、优化https

    参考:编程思想的HTTPS扫盲系列

  • 相关阅读:
    LeetCode 453 Minimum Moves to Equal Array Elements
    LeetCode 112 Path Sum
    LeetCode 437 Path Sum III
    LeetCode 263 Ugly Number
    Solutions and Summay for Linked List Naive and Easy Questions
    AWS–Sysops notes
    Linked List
    All About Linked List
    datatable fix error–Invalid JSON response
    [转]反编译c#的相关问题
  • 原文地址:https://www.cnblogs.com/ctxsdhy/p/12205771.html
Copyright © 2011-2022 走看看