首页 > 其他分享 >解析HTTPS如何让数据传输更安全

解析HTTPS如何让数据传输更安全

时间:2023-02-22 16:31:45浏览次数:37  
标签:公钥 浏览器 套件 密钥 HTTPS 服务器 数据传输 解析 加密

鉴于 HTTP 的明文传输使得传输过程毫无安全性可言,且制约了网上购物、在线转账等一系列场景应用,于是引入加密方案。

从 HTTP 协议栈层面来看,我们可以在 TCP 和 HTTP 之间插入一个安全层,所有经过安全层的数据都会被加密或者解密。

总的来说,安全层有两个主要的职责:对发起 HTTP 请求的数据进行加密操作和对接收到 HTTP 的内容进行解密操作。

1、使用对称加密

提到加密,最简单的方式是使用对称加密。所谓对称加密是指加密和解密都使用的是相同的密钥。

要在两台电脑上加解密同一个文件,我们至少需要知道加解密方式和密钥,因此,在 HTTPS 发送数据之前,浏览器和服务器之间需要协商加密方式和密钥,过程如下所示:

解析HTTPS如何让数据传输更安全_HTTPS

通过上图我们可以看出,HTTPS 首先要协商加解密方式,这个过程就是 HTTPS 建立安全连接的过程。为了让加密的密钥更加难以攻破,我们让服务器和客户端同时决定密钥,具体过程如下:

  • 浏览器发送它所支持的加密套件列表和一个随机数 client-random,这里的加密套件是指加密的方法,加密套件列表就是指浏览器能支持多少种加密方法列表。
  • 服务器会从加密套件列表中选取一个加密套件,然后还会生成一个随机数 service-random,并将 service-random 和加密套件列表返回给浏览器。
  • 最后浏览器和服务器分别返回确认消息。

这样浏览器端和服务器端都有相同的 client-random 和 service-random 了,然后它们再使用相同的方法将 client-random 和 service-random 混合起来生成一个密钥 master secret,有了密钥 master secret 和加密套件之后,双方就可以进行数据的加密传输了。

2、使用非对称加密

和对称加密只有一个密钥不同,非对称加密算法有 A、B 两把密钥,如果你用 A 密钥来加密,那么只能使用 B 密钥来解密;反过来,如果你要 B 密钥来加密,那么只能用 A 密钥来解密。

在 HTTPS 中,服务器会将其中的一个密钥通过明文的形式发送给浏览器,我们把这个密钥称为公钥,服务器自己留下的那个密钥称为私钥。顾名思义,公钥是每个人都能获取到的,而私钥只有服务器才能知道,不对任何人公开。

解析HTTPS如何让数据传输更安全_HTTPS_02

根据该图,我们来分析下使用非对称加密的请求流程。

  • 首先浏览器还是发送加密套件列表给服务器。
  • 然后服务器会选择一个加密套件,不过和对称加密不同的是,使用非对称加密时服务器上需要有用于浏览器加密的公钥和服务器解密 HTTP 数据的私钥,由于公钥是给浏览器加密使用的,因此服务器会将加密套件和公钥一道发送给浏览器。
  • 最后就是浏览器和服务器返回确认消息。

这样浏览器端就有了服务器的公钥,在浏览器端向服务器端发送数据时,就可以使用该公钥来加密数据。由于公钥加密的数据只有私钥才能解密,所以即便黑客截获了数据和公钥,他也是无法使用公钥来解密数据的。

因此采用非对称加密,就能保证浏览器发送给服务器的数据是安全的了,这看上去似乎很完美,不过这种方式依然存在两个严重的问题。

  • 第一个是非对称加密的效率太低。这会严重影响到加解密数据的速度,进而影响到用户打开页面的速度。
  • 第二个是无法保证服务器发送给浏览器的数据安全。虽然浏览器端可以使用公钥来加密,但是服务器端只能采用私钥来加密,私钥加密只有公钥能解密,但黑客也是可以获取得到公钥的,这样就不能保证服务器端数据的安全了。

3、对称加密和非对称加密搭配使用

一个更加完美的方案,那就是在传输数据阶段依然使用对称加密,但是对称加密的密钥我们采用非对称加密来传输。

解析HTTPS如何让数据传输更安全_HTTPS_03

解析HTTPS如何让数据传输更安全_HTTPS_04从图中可以看出,改造后的流程是这样的:

  • 首先浏览器向服务器发送对称加密套件列表、非对称加密套件列表和随机数 client-random;
  • 服务器保存随机数 client-random,选择对称加密和非对称加密的套件,然后生成随机数 service-random,向浏览器发送选择的加密套件、service-random 和公钥;
  • 浏览器保存公钥,并生成随机数 pre-master,然后利用公钥对 pre-master 加密,并向服务器发送加密后的数据;
  • 最后服务器拿出自己的私钥,解密出 pre-master 数据,并返回确认消息。

到此为止,服务器和浏览器就有了共同的 client-random、service-random 和 pre-master,然后服务器和浏览器会使用这三组随机数生成对称密钥,因为服务器和浏览器使用同一套方法来生成密钥,所以最终生成的密钥也是相同的。

需要特别注意的一点,pre-master 是经过公钥加密之后传输的,所以黑客无法获取到 pre-master,这样黑客就无法生成密钥,也就保证了黑客无法攻破传输过程中的数据了。

4、添加数字证书

对于浏览器来说,数字证书有两个作用:一个是通过数字证书向浏览器证明服务器的身份,另一个是数字证书里面包含了服务器公钥。

含有数字证书的 HTTPS 的请求流程:

解析HTTPS如何让数据传输更安全_HTTPS_05

解析HTTPS如何让数据传输更安全_HTTPS_06这里主要有两点改变:

  • 服务器没有直接返回公钥给浏览器,而是返回了数字证书,而公钥正是包含在数字证书中的;
  • 在浏览器端多了一个证书验证的操作,验证了证书之后,才继续后续流程。

通过引入数字证书,我们就实现了服务器的身份认证功能,这样即便黑客伪造了服务器,但是由于证书是没有办法伪造的,所以依然无法欺骗用户。


标签:公钥,浏览器,套件,密钥,HTTPS,服务器,数据传输,解析,加密
From: https://blog.51cto.com/key3feng/6079233

相关文章

  • SafeArray 一维数组解析方法
    //方法2SafeArrayGetElement(SAFEARRAY*psa,long*ailndex,void*pvElem)if(pvDataValues->vt&VT_ARRAY){switch(pvDataValues->vt){......
  • 《分布式技术原理与算法解析》学习笔记Day19
    分布式通信:消息队列什么是消息队列?队列是一种具有先进先出特点的数据结构,消息队列是基于队列实现的、存储具有特定格式的消息数据。消息以特定格式放入这个队列的尾部后......
  • golang 解析json数据
       packagemainimport(jsoniter"github.com/json-iterator/go")funcString2Bytes(datastring)[]byte{return[]byte(data)}funcmain(){......
  • java初学-代码解析02
    publicclassHelloWorld{ publicstaticvoidmain(String[]args){ System.out.println("HelloWorld"); }} 能修改的地方只有类名称和双括号里面的语句......
  • 深入解析 JavaScript 中 ES6 的 Generator 生成器
    前言大家好,我是CoderBin,本次将深入解析JavaScript中ES6的Generator生成器,希望对大家有所帮助,谢谢。如果文中有不对、疑惑的地方,欢迎在评论区留言指正......
  • linux源码解析15- 匿名页面的生命周期
    1.匿名页面的产生从内核角度看,如下情况会产生匿名页面:1.1用户空间malloc()/mmap()分配的内存;在内核发生缺页中断时,调用do_anonymous_page()产生匿名页;1.2写时复制:当......
  • https 自签名证书
    创建rootCA证书cd~&&mkdirmycertcdmycertopensslgenrsa-des3-outrootCA.key2048opensslreq-x509-new-nodes-keyrootCA.key-sha256-days1024-outr......
  • 物理服务器与云服务器的优缺点解析
    如果您想在线提供信息或应用程序,则需要一个安全可靠且量身定制的托管基础。无论它是一个业余爱好网站,还是博客论坛,抑或是公司数据库,都需要评估自身需求,例如需要怎样的服务......
  • Charles的Https抓包配置
    一、现象与问题  通过使用Charles我们发现,对于https请求,其受到的报文数据是乱码的状态。二、解决方案1、安装SSL证书  在Charles工具中找到:  然后弹窗中依次......
  • 【Spring AOP】【七】Spring AOP源码解析-代理对象执行过程
    1 前言不知道你现在清晰了没,我们一路从AOP的基础概念,到AOP配置的解析,到AOP在Bean的生命周期的切入时机以及创建代理的过程一步步走下来,脑瓜还清晰不,那我们是不是就该到......