灵魂拷问第9篇:HTTPS为什么让数据传输更安全?

谈到HTTPS, 就不得不谈到与之相对的HTTPHTTP的特性是明文传输,因此在传输的每一个环节,数据都有可能被第三方窃取或者篡改,具体来说,HTTP 数据经过 TCP 层,然后经过WIFI路由器运营商目标服务器,这些环节中都可能被中间人拿到数据并进行篡改,也就是我们常说的中间人攻击

为了防范这样一类攻击,我们不得已要引入新的加密方案,即 HTTPS。

HTTPS并不是一个新的协议, 而是一个加强版的HTTP。其原理是在HTTPTCP之间建立了一个中间层,当HTTPTCP通信时并不是像以前那样直接通信,直接经过了一个中间层进行加密,将加密后的数据包传给TCP, 响应的,TCP必须将数据包解密,才能传给上面的HTTP。这个中间层也叫安全层安全层的核心就是对数据加解密

接下来我们就来剖析一下HTTPS的加解密是如何实现的。

对称加密和非对称加密

概念

首先需要理解对称加密非对称加密的概念,然后讨论两者应用后的效果如何。

对称加密是最简单的方式,指的是加密解密用的是同样的密钥

而对于非对称加密,如果有 A、 B 两把密钥,如果用 A 加密过的数据包只能用 B 解密,反之,如果用 B 加密过的数据包只能用 A 解密。

加解密过程

接着我们来谈谈浏览器服务器进行协商加解密的过程。

首先,浏览器会给服务器发送一个随机数client_random和一个加密的方法列表。

服务器接收后给浏览器返回另一个随机数server_random和加密方法。

现在,两者拥有三样相同的凭证: client_randomserver_random和加密方法。

接着用这个加密方法将两个随机数混合起来生成密钥,这个密钥就是浏览器和服务端通信的暗号

各自应用的效果

如果用对称加密的方式,那么第三方可以在中间获取到client_randomserver_random和加密方法,由于这个加密方法同时可以解密,所以中间人可以成功对暗号进行解密,拿到数据,很容易就将这种加密方式破解了。

既然对称加密这么不堪一击,我们就来试一试非对称加密。在这种加密方式中,服务器手里有两把钥匙,一把是公钥,也就是说每个人都能拿到,是公开的,另一把是私钥,这把私钥只有服务器自己知道。

好,现在开始传输。

浏览器把client_random和加密方法列表传过来,服务器接收到,把server_random加密方法公钥传给浏览器。

现在两者拥有相同的client_randomserver_random和加密方法。然后浏览器用公钥将client_randomserver_random加密,生成与服务器通信的暗号

这时候由于是非对称加密,公钥加密过的数据只能用私钥解密,因此中间人就算拿到浏览器传来的数据,由于他没有私钥,照样无法解密,保证了数据的安全性。

这难道一定就安全吗?聪明的小伙伴早就发现了端倪。回到非对称加密的定义,公钥加密的数据可以用私钥解密,那私钥加密的数据也可以用公钥解密呀!

服务器的数据只能用私钥进行加密(因为如果它用公钥那么浏览器也没法解密啦),中间人一旦拿到公钥,那么就可以对服务端传来的数据进行解密了,就这样又被破解了。而且,只是采用非对称加密,对于服务器性能的消耗也是相当巨大的,因此我们暂且不采用这种方案。

对称加密和非对称加密的结合

可以发现,对称加密和非对称加密,单独应用任何一个,都会存在安全隐患。那我们能不能把两者结合,进一步保证安全呢?

其实是可以的,演示一下整个流程:

  1. 浏览器向服务器发送client_random和加密方法列表。
  2. 服务器接收到,返回server_random、加密方法以及公钥。
  3. 浏览器接收,接着生成另一个随机数pre_random, 并且用公钥加密,传给服务器。(敲黑板!重点操作!)
  4. 服务器用私钥解密这个被加密后的pre_random

现在浏览器和服务器有三样相同的凭证:client_randomserver_randompre_random。然后两者用相同的加密方法混合这三个随机数,生成最终的密钥

然后浏览器和服务器尽管用一样的密钥进行通信,即使用对称加密

这个最终的密钥是很难被中间人拿到的,为什么呢? 因为中间人没有私钥,从而拿不到pre_random,也就无法生成最终的密钥了。

回头比较一下和单纯的使用非对称加密, 这种方式做了什么改进呢?本质上是防止了私钥加密的数据外传。单独使用非对称加密,最大的漏洞在于服务器传数据给浏览器只能用私钥加密,这是危险产生的根源。利用对称和非对称加密结合的方式,就防止了这一点,从而保证了安全。

添加数字证书

尽管通过两者加密方式的结合,能够很好地实现加密传输,但实际上还是存在一些问题。黑客如果采用 DNS 劫持,将目标地址替换成黑客服务器的地址,然后黑客自己造一份公钥和私钥,照样能进行数据传输。而对于浏览器用户而言,他是不知道自己正在访问一个危险的服务器的。

事实上HTTPS在上述结合对称和非对称加密的基础上,又添加了数字证书认证的步骤。其目的就是让服务器证明自己的身份。

传输过程

为了获取这个证书,服务器运营者需要向第三方认证机构获取授权,这个第三方机构也叫CA(Certificate Authority), 认证通过后 CA 会给服务器颁发数字证书

这个数字证书有两个作用:

  1. 服务器向浏览器证明自己的身份。
  2. 把公钥传给浏览器。

这个验证的过程发生在什么时候呢?

当服务器传送server_random、加密方法的时候,顺便会带上数字证书(包含了公钥), 接着浏览器接收之后就会开始验证数字证书。如果验证通过,那么后面的过程照常进行,否则拒绝执行。

现在我们来梳理一下HTTPS最终的加解密过程:

认证过程

浏览器拿到数字证书后,如何来对证书进行认证呢?

首先,会读取证书中的明文内容。CA 进行数字证书的签名时会保存一个 Hash 函数,来这个函数来计算明文内容得到信息A,然后用公钥解密明文内容得到信息B,两份信息做比对,一致则表示认证合法。

当然有时候对于浏览器而言,它不知道哪些 CA 是值得信任的,因此会继续查找 CA 的上级 CA,以同样的信息比对方式验证上级 CA 的合法性。一般根级的 CA 会内置在操作系统当中,当然如果向上找没有找到根级的 CA,那么将被视为不合法。

总结

HTTPS并不是一个新的协议, 它在HTTPTCP的传输中建立了一个安全层,利用对称加密非对称加密结合数字证书认证的方式,让传输过程的安全性大大提高。

原文地址:https://www.cnblogs.com/guchengnan/p/12160718.html

时间: 2024-10-29 22:03:35

灵魂拷问第9篇:HTTPS为什么让数据传输更安全?的相关文章

灵魂拷问第1篇:能不能说一说浏览器缓存?

缓存是性能优化中非常重要的一环,浏览器的缓存机制对开发也是非常重要的知识点.接下来以三个部分来把浏览器的缓存机制说清楚: 强缓存 协商缓存 缓存位置 强缓存 浏览器中的缓存作用分为两种情况,一种是需要发送HTTP请求,一种是不需要发送. 首先是检查强缓存,这个阶段不需要发送HTTP请求. 如何来检查呢?通过相应的字段来进行,但是说起这个字段就有点门道了. 在HTTP/1.0和HTTP/1.1当中,这个字段是不一样的.在早期,也就是HTTP/1.0时期,使用的是Expires,而HTTP/1.1使

灵魂拷问第6篇:谈谈你对重绘和回流的理解

我们首先来回顾一下渲染流水线的流程: 接下来,我们将来以此为依据来介绍重绘和回流,以及让更新视图的另外一种方式——合成. 回流 首先介绍回流.回流也叫重排. 触发条件 简单来说,就是当我们对 DOM 结构的修改引发 DOM 几何尺寸变化的时候,会发生回流的过程. 具体一点,有以下的操作会触发回流: 一个 DOM 元素的几何属性变化,常见的几何属性有width.height.padding.margin.left.top.border 等等, 这个很好理解. 使 DOM 节点发生增减或者移动. 读

灵魂拷问第2篇:能不能说一说浏览器的本地存储?各自优劣如何?

浏览器的本地存储主要分为Cookie.WebStorage和IndexedDB, 其中WebStorage又可以分为localStorage和sessionStorage.接下来我们就来一一分析这些本地存储方案. Cookie Cookie 最开始被设计出来其实并不是来做本地存储的,而是为了弥补HTTP在状态管理上的不足. HTTP 协议是一个无状态协议,客户端向服务器发请求,服务器返回响应,故事就这样结束了,但是下次发请求如何让服务端知道客户端是谁呢? 这种背景下,就产生了 Cookie. C

灵魂拷问第7篇:能不能说一说XSS攻击?

什么是 XSS 攻击? XSS 全称是 Cross Site Scripting(即跨站脚本),为了和 CSS 区分,故叫它XSS.XSS 攻击是指浏览器中执行恶意脚本(无论是跨域还是同域),从而拿到用户的信息并进行操作. 这些操作一般可以完成下面这些事情: 窃取Cookie. 监听用户行为,比如输入账号密码后直接发送到黑客服务器. 修改 DOM 伪造登录表单. 在页面中生成浮窗广告. 通常情况,XSS 攻击的实现有三种方式——存储型.反射型和文档型.原理都比较简单,先来一一介绍一下. 存储型

灵魂拷问:如何检查Java数组中是否包含某个值 ?

摘自:https://www.cnblogs.com/qing-gee/p/12053156.html 在逛 programcreek 的时候,我发现了一些专注细节但价值连城的主题.比如说:如何检查Java数组中是否包含某个值 ?像这类灵魂拷问的主题,非常值得深入地研究一下. 另外,我想要告诉大家的是,作为程序员,我们千万不要轻视这些基础的知识点.因为基础的知识点是各种上层技术共同的基础,只有彻底地掌握了这些基础知识点,才能更好地理解程序的运行原理,做出更优化的产品. 我曾在某个技术论坛上分享过

灵魂拷问:Java如何获取数组和字符串的长度?length还是length()?

限时 1 秒钟给出答案,来来来,听我口令:"Java 如何获取数组和字符串的长度?length 还是 length()?" 在逛 programcreek 的时候,我发现了上面这个主题.说实话,我当时脑海中浮现出了这样一副惊心动魄的画面: 面试官老马坐在我的对面,地中海式的发型令我敬佩有加.尽管略显疲惫,但他仍然自信地向我抛出了上面这个问题.稍稍迟疑了一下,我回答说:"数组用 length,字符串用 length 跟上小括号".老马不愧是面试中的高手,一瞬间就从我的

[灵魂拷问♂]系列

[灵魂拷问♂]系列 SP1043 GSS1 - Can you answer these queries I 题目:链接 大致题意:求区间最大子段和,不带修改. 题解: 对于每个线段树节点.维护以下几个值: l, r:左右端点 sum:区间和 val:区间最大子段和 lv:一定包括区间左端点的最大子段和 rv:一定包括区间右端点的最大子段和 lv转移:lv = max(左儿子的lv, 左儿子的sum + 右儿子的lv) rv转移:rv = max(右儿子的rv,右儿子的sum + 左儿子的rv)

工厂设计模式灵魂拷问-Java实现

show me the code and take to me,做的出来更要说的明白 GitHub项目JavaHouse同步收录 喜欢就点个赞呗! 你的支持是我分享的动力! 引入 我们经常听到工厂模式,比如说 Spring 用了工厂模式啦,面试也会被问到工厂模式等等,这见工厂模式是日常开发中比较重要的一种设计模式.其实工厂模式也是比较简单的一种设计模式,这年头似乎不了解工厂模式,你都不好意思说你学过 编程一样(手动狗头).那么,允许我灵魂拷问一下,你真的了解工厂模式吗. UML类图 不急,我们先

StartSSL免费SSL证书成功申请-HTTPS让访问网站更安全

StartSSL免费SSL证书成功申请-HTTPS让访问网站更安全 一.StartSSL个人证书登录申请 1.StartSSL官网: 1.官方首页:http://www.startssl.com/ 2.控制面板:http://www.startssl.com/?app=12 2.第一次用StartSSL,先进入控制面板,先点击注册. 3.然后是填写你的个人基本信息,以部落的经验,主要地址填写详细,StartSSL会根据你的IP自动填入你所在的地址. 4.提交后你的邮箱会收到一个验证码. 5.用这