# HTTPS加密原理简介

https相关的资料已经非常多,本文尽量以最简洁的图文介绍大致原理,不涉及细节。

本文开始前,读者需要先了解对称加密非对称加密hash算法相关知识。

# HTTPS如何保证传输数据安全?

  1. 服务器将公钥(非对称加密)发送给客户端
  2. 客户端生成随机密钥(对称加密),通过公钥加密后发送给服务端,这样双方都拥有了对称加密的密钥
  3. 后续传输的数据是通过密钥加密的密文(所以传输的数据是安全的)

https加密过程

TIP

http协议传输的数据相当于裸奔,数据从服务器到浏览器,经过的任意一个网络节点(代理、wifi、运营商等等)都可以随意篡改用户数据。

# 如何确保服务器公钥没有被篡改?

从上一节可以看到,第一步服务器下发公钥给客户端是明文的,所以确保公钥未被篡改至关重要。

上一节第一步,服务器下发的证书中主要包含三个元素:服务器公钥、证书颁发机构信息、颁发机构签名。

签名来历

浏览器可以根据颁发机构信息找到其对应的公钥,然后三步即可验证服务器公钥是否安全:

  1. 通过颁发机构公钥解密签名,得到服务器公钥的hash值
  2. hash服务器公钥,得到其公钥的hash值
  3. 对比前两步得到的公钥hash值是否相同,如果相同则说明公钥未被篡改

TIP

这里我们可以总结得到:证书是否可信(或者说公钥是否安全),需要通过证书颁发者(的公钥)来验证。

# 浏览器如何确保颁发机构是否可信?

从第二节可以看到,验证服务器公钥安全性的关键在于颁发机构是否可信。

证书颁发机构(组织)是一个树状结构,如图:
证书结构

所以说这个问题类似第二个问题,验证颁发机构是否可信(公钥是否安全),需要通过上层的颁发机构来验证。
采用第二步的方式进行递归验证,即可确保所有证书都是安全的。
证书验证过程

递归的终点即根证书,如何验证根证书是否可信呢?
答案是浏览器内置的,无条件信任。(浏览器还会信任操作系统的证书)

# 如何篡改HTTPS协议传输的数据?

https经过这么严密的验证过程,还能篡改数据么? 可以的。

从第三步可以看到,只要浏览器信任了假根证书,前面的验证步骤都不安全了。
代理工具的根证书被信任后就可以生成假证书返回给浏览器,而不会被浏览器发现。
所以,所有代理工具都必须用户信任其根证书,才能够查看篡改https请求的内容。

💗 博主正处于裸辞待业状态,欢迎 商务合作 💗

相关文章

从 React 看前端 UI 代码范式革命

alt text 前言 本来打算写的主题是“我为什么讨厌 React Hooks API”,展开聊聊“小甜甜”是如何变成“牛夫人”的,没想到越写越严肃:) React 是两次前端范式革命的引领者,至今仍有繁荣的社区和旺盛的创造力; React 多次天才又激进的创新,一些想法被借鉴改良、一些引发广泛质疑,大部分是被认同和接受的; ...

一句话总结:TS 何时选择 interface 或 type

用 interface 描述类型的结构,用 type 描述类型关系。 有点编程基础中数据结构与算法的味道。 结构即是类型的属性集合 // 如 Point3D 的属性集合: x, y, z。 interface Poi ...

JS 定时器时长控制细节

背景 JS 最常使用 setTimeout、setInterval 来延迟或定时循环执行函数,通常会传递第二个参数来控制延迟或间隔执行的时间。 但开发者必须意识到函数执行时间并非精确地符合预期,在以下场景中它会超出你的预期 CPU 繁忙(主线程被长时间占用),JS 无法按开发者设定的预期时间延迟函数 定时器过于频繁地执行(第二个参数 < 4),达到一定 ...

JS 多线程并发

[[toc]] 为什么需要并发 我们常听说 JS 是单线程模型,即所有代码都在主线程中执行的。 如果某些任务计算量较大,将阻塞主线程,UI 界面轻则掉帧、重则卡死。 // 提示:本文所有代理均可复制到浏览器控制台中执行,验证效果 // ...

系统化学习 TS 类型系统

目的:快速、系统性的入门 TS 类型系统 [[toc]] 前言 TS 是什么? TS 是 JS 的超集, TS = JS + 类型系统 为了描述如此复杂(由于 JS 语言的灵活性/复杂性)的类型信息,类型系统表现出非常明显的编程语言特性。 以学习编程语言的方式,来学习 TS 类型系统 关键字/符号 类型: boolean, number, stri ...

跨域(Options)请求介绍及解决方法

介绍 OPTIONS请求指method为OPTIONS的http请求。 通俗来说:它的作用是用于WEB服务器是否支持某些 header,也可以叫做预检请求(顾名思义:预先检测)。 程序员:跨域发送 http get { headers { xxx: abc } } 浏览器:等等,你这个请求有点奇怪,我去跟服务器确认下 浏览器:发送 http options ...

单测(Unit Test)技巧

前言 本文目的是提高编写单测的效率,适合于有一定单测编写经验,但被单测困扰的同学。 后文的示例都在 unit-test-examples 仓库中。 单测的意义与价值 单测本质:将测试行为及结果固化下来,自动检查被测试代码的运行结果是否符合期望。 单测是一 ...

compilerOptions字段详解

{ "compilerOptions": { /* 基本选项 */ "target": "es5", // 指定 ECMAScript 目标版本: 'ES3' (default), 'ES5', 'ES6'/'ES2015', 'ES2016', 'ES2017', or 'ESNEXT' "module": ...

JS 正则表达式基础

前言 个人经验,正则是一个前期少量投入,回报超高的技能点。 其适用范围非常广泛,如批量文本处理、源码替换、程序中逻辑判断等等。 本文只介绍常用的基础知识、技巧,让初学者快速掌握大部分日常所需的正则知识。目标是 5 分钟内可逐字读完,10 分钟内可把例子都动手实践一 ...

JS优缺点

回顾上两期 优点(简单) 对象 链(原型链 & 作用域链) 一切都是对象(包括函数),构建世界的原料,越少越简单、灵活。 jimu 观察者模式,例: class Observer { constructor() { this.subscribe ...