📕
余烬的小册
数据结构与算法GitHub
  • 总述
  • 经验记录
    • 经验总结
      • web component
      • 前端性能优化总结与分析
      • 我的长列表优化方案
      • 双向通讯解决方案
      • 🔧基于istanbul实现代码测试覆盖率工具
      • 表单系统(低代码表单)
      • 跨端小程序
      • 设计一个即时聊天功能
      • 跨页面通讯 3658699fe4cb4d0bbe22b0881390bacd
    • 踩坑记录
      • HTML踩坑记录
      • Flutter踩坑记录
      • CSS踩坑记录
  • 源码解析
    • Vue源码解析
      • Vue2源码解析系列-响应式原理
      • Vue2源码解析系列-模板编译
      • Vue2源码解析系列-渲染系统(待更新)
        • Patch
      • Vue2源码解析系列-调度系统(todo)
      • Vue2组件更新流程(todo)
      • 如何学习Vue源码
      • Vue3源码解析系列-响应系统
      • Vue3源码解析系列-渲染系统
      • Vue3源码解析系列-组件化和渲染优化(todo)
      • Vue router源码解析(todo)
    • React源码解析(todo)
    • 微前端
      • qiankun源码解析(todo)
    • Vite源码解析
      • Vite Client源码
      • Vite Server源码(todo)
  • 前端技术
    • javaScript
      • ES6
        • 变量声明
        • 模块化
        • 箭头函数
        • 你不知道的for...of
        • 新的数据结构Set和Map
        • JavaScript异步编程终极解决方案
        • ES6 Class 3a0c0a225a534984aabe9a943c5df975
      • JavaScript Error
      • JavaScript浅拷贝和深拷贝
      • JavaScript闭包
      • JavaScript最佳实践
      • JavaScript设计模式
      • async函数的polyfill
    • 深入理解JavaScript系列
      • JavaScript中的继承
      • JavaScript原始类型和引用类型
      • JavaScript浅拷贝和深拷贝
      • JavaScript手写系列
      • JavaScript之this
      • 词法环境和环境记录
      • JavaScript内存泄漏
      • 执行上下文
      • 从ECMAScript规范中学习this
    • TypeScript
      • TypeScript基础教程
      • Typescript高级操作
      • TypeScript工具类型
      • Typescript手写实现工具类型
      • Typescript总结(思维导图)
    • 浏览器原理
      • 页面渲染原理
      • 浏览器存储
      • JavaScript事件循环
      • 事件循环
      • 跨域
      • DOM事件流
      • 从输入url到页面渲染
      • 判断节点之间的关系及根据节点关系查找节点
      • history API
    • 跨端技术
      • Flutter
        • Flutter布局组件
    • 前端工程化
      • Babel插件开发指南
      • 循环依赖
      • pm2
    • React
      • React 状态管理
      • React组件通讯
      • Redux入门
      • Flux
      • React Hook(todo)
      • Effect
  • 服务器端
    • 计算机网络
      • 应用层
      • 运输层
      • 物理层
      • 数据链路层
      • HTTP缓存
      • HTTPS
      • 网络层
    • NodeJs
      • Node.js
      • nodejs最佳实践
      • 《深入浅出Nodejs》小结
      • mongoose填充(populate)
      • node事件循环
      • Node子进程
      • nestjs从零开始
      • nodejs流
      • Nodejs调试
      • Koa源码解析
    • 服务器
      • 操作系统
      • Linux
      • nginx常用指令
      • nginx常用配置
    • 数据库
      • Mysql常见语法
      • MongoDB Indexes索引
  • 前端安全与性能优化
    • 前端安全
      • 跨站脚本攻击(XSS)
      • 跨站点请求伪造(CSRF)
      • 点击劫持
      • 中间人攻击
      • 越权攻击与JWT
    • 前端性能优化
      • 前端监控系统
      • 前端性能优化总结与分析 7348bba0918645b1899006dc842a64c1
      • 衡量性能的核心指标 0dc15ef127cf4f4a9f1137c377420292
      • 图片懒加载
  • 杂项
    • 其他
      • Git
      • web component框架
      • 实现滚动框的懒加载
      • Stencil指南
    • CSS
      • 定位和层叠上下文
      • BFC
      • 盒模型
      • css选择器
      • css变量
由 GitBook 提供支持
在本页
  • 加密
  • 身份认证
  • 避免篡改
  • HTTPS 握手流程
在GitHub上编辑
  1. 服务器端
  2. 计算机网络

HTTPS

tags: 计算机网络 Created time: July 17, 2022 9:55 AM emoji: 🌐

HTTPS 基于 HTTP,通过 SSL 或 TLS 提供加密处理数据、验证对方身份以及数据完整性保护功能。

**HTTPS = HTTP + SSL 协议或 TLS 协议。**也就是说 https 本质上是基于 http 协议的,只不过增加了一个安全层(SSL 协议或 TLS 协议)。

HTTPS 的目的是解决 http 传输过程中不安全的问题,简单来说它解决了三件事:

  • 数据明文传输,易泄露隐私

  • 无法对服务器进行身份认证。

  • 数据传输过程中易被篡改

加密

解决数据泄露的最好方式是对数据进行加密。https 使用了公钥加密和对称密钥加密结合的方式来加密数据,保证数据不会在传输过程中泄露信息。

公钥加密是服务器将公钥传给客户端,而私钥自己保存,客户端拿到公钥后对数据进行加密,然后发送到服务器上,只有服务器的私钥才能解密,也就是说只要服务器的私钥不泄露,安全性还是很高的。

对称加密是加密和解密都是同一个密钥,这种方式效率比较高,但是有个很大的问题,就是如何将密钥传给客户端,如果直接传输,那么就会很容易造成密钥泄露,那么加密就形同虚设了。

公钥加密的特点是安全性高,但是效率低,而对称密钥加密的特点是效率高,但是安全性低。

https 利用了两者的特点,先用公钥加密的方式将密钥传给客户端,这样解决了密钥泄露的风险,然后双方再使用对称密钥的方式进行加密通讯。

身份认证

https 通过数字证书来解决身份认证的问题。

第三方权威机构,对服务器进行认证,然后对服务器的公开密钥进行数字签名,并且将此公钥放入到为此服务器颁发的数字证书之中。

当客户端请求 https 时,服务器只需将数字证书发送给客户端,客户端可以通过数字证书进行认证,数字证书有两个作用。

  • 一是数字证书是经过权威机构加密过的,浏览器中内置解密密钥,同时数字证书难以伪造,因此将服务器公钥放入数字证书中可以避免公钥被篡改或者替换。

  • 二是客户端可以通过数字证书来对服务器进行身份认证,判断该服务器是否可以信赖。

避免篡改

HTTPS 在发送数据时会附加一种叫做 MAC(消息身份验证码)的报文摘要,MAC 能够查知报文是否遭到篡改,从而保护报文的完整性。

HTTPS 握手流程

可以分为三步: 密钥协商、认证、加密

  1. 双发“协商”要使用的加密组件和 SSL(或 TLS)版本

  2. 服务器发送数字证书,客户端进行验证,并且从中去除公钥

  3. 客户端用取出来的公钥加密随机密码串,并发送服务器,服务器接收后用私钥解密,然后双发使用随机密码串来进行对称密钥加密通讯。

具体步骤

HTTPS通信

步骤 1: 客户端通过发送 Client Hello 报文开始 SSL 通信。报文中包含客户端支持的 SSL 的指定版本、加密组件(Cipher Suite)列表(所使用的加密算法及密钥长度等)。步骤 2: 服务器可进行 SSL 通信时,会以 Server Hello 报文作为应答。和客户端一样,在报文中包含 SSL 版本以及加密组件。服务器的加密组件内容是从接收到的客户端加密组件内筛选出来的。步骤 3: 之后服务器发送 Certificate 报文。报文中包含公开密钥证书。步骤 4: 最后服务器发送 Server Hello Done 报文通知客户端,最初阶段的 SSL 握手协商部分结束。步骤 5: SSL 第一次握手结束之后,客户端以 Client KeyExchange 报文作为回应。报文中包含通信加密中使用的一种被称为 Pre-master secret 的随机密码串。该报文已用步骤 3 中的公开密钥进行加密。步骤 6: 接着客户端继续发送 Change Cipher Spec 报文。该报文会提示服务器,在此报文之后的通信会采用 Pre-master secret 密钥加密。步骤 7: 客户端发送 Finished 报文。该报文包含连接至今全部报文的整体校验值。这次握手协商是否能够成功,要以服务器是否能够正确解密该报文作为判定标准。步骤 8: 服务器同样发送 Change Cipher Spec 报文。步骤 9: 服务器同样发送 Finished 报文。步骤 10: 服务器和客户端的 Finished 报文交换完毕之后,SSL 连接就算建立完成。当然,通信会受到 SSL 的保护。从此处开始进行应用层协议的通信,即发送 HTTP 请求。步骤 11: 应用层协议通信,即发送 HTTP 响应。步骤 12: 最后由客户端断开连接。断开连接时,发送 close_notify 报文。上图做了一些省略,这步之后再发送 TCP FIN 报文来关闭与 TCP 的通信。

上一页HTTP缓存下一页网络层
https://raw.githubusercontent.com/const-love-365-10000/cloudImg/master/img/epub_907764_181.jpeg