当前位置: 首页 > news >正文

HTTPS实现原理

1 为什么需要HTTPS?

HTTP 在进行数据传输时采用明文传输,数据包中的用户信息等隐私数据可以被第三方通过抓包等方式窃取,是不安全的。

如果客户端使用 MD5 加密算法对数据进行加密,由于加密后的结果是不可逆的,服务器无法进行解析,只能使用加密后的字符串进行校验用户身份,而第三方也可以获取数据包中的加密字符串,从而骗取服务器的信任,所以也无法通过 MD5 加密算法解决 HTTP 传输不安全的问题。

为了解决 HTTP 明文传输不安全的问题,比 HTTP 安全的 HTTPS 应运而生。

2 HTTPS是什么?

HTTPS = HTTP + SSL/TLS。HTTPS 使用 HTTP 进行通信,并使用 SSL/TLS 在进行数据传输时对数据包进行加密,确保数据进行安全传输。

在这里插入图片描述

SSL (Secure Sockets Layer) 是由 Netscape 公司设计的用于 Web 的安全通信协议,开发至 3.0 版本后交由 IETF 进行标准化,IETF 在 SSL 3.0 基础上开发出了 TLS 1.0 (Transport Layer Security),并写入了 RFC。

3 对称加密与非对称加密

3.1 对称加密

对称加密,顾名思义,通信双方采用相同的密钥对数据进行加解密,常见的对称加密算法有 AES、DES、3DES等。

通信过程:在接收到客户端的请求后,服务器生成一把密钥,并通过网络发送给客户端,客户端拿到密钥后对数据进行加密,将加密后的数据发送给服务器,服务器再使用密钥对数据进行解密。

优点:加解密计算量小,速度快。

缺点:由于只有一个密钥供通信双方使用,所以密钥需要在一方生成后传输给另一方,在传输过程中存在被截获的风险。

3.2 非对称加密

非对称加密,顾名思义,加密和解密使用不同的密钥:公钥 (Public Key) 和私钥 (Private Key)。公钥和私钥是一对密钥,使用公钥加密的数据只能通过对应的私钥解密,使用私钥加密的数据也只能通过对应的公钥解密。常见的非对称加密算法有 RSA 等。

通信过程:在接收到客户端的请求后,服务器生成一对密钥,并将其中一把作为公钥通过网络发送给客户端,客户端拿到公钥后对数据进行加密,将加密后的数据发送给服务器,服务器使用私钥对数据进行解密。

优点:加密和解密使用不同的密钥,私钥不用进行网络传输,安全性高。

缺点:加解密计算量大,速度慢,资源占用大。

4 HTTPS原理

HTTPS 采用混合加密方式进行数据传输。考虑到对称加密的密钥可能被截获以及非对称加密计算量大,速度慢的缺点,先采用非对称加密传输密钥,然后采用对称加密对数据包进行加解密。

在接收到客户端的请求后,服务器生成一对公钥和私钥,并把公钥发送给客户端,客户端拿到公钥后,生成用于对称加密的密钥 KEY,然后用公钥对 KEY 进行加密并发送给服务器,服务器接收到后使用私钥进行解密获得 KEY,然后客户端和服务器就可以使用这个相同的 KEY 对数据包进行加解密,如下图所示。

在这里插入图片描述

但是,按照上述过程就能保证安全了吗?

答案是否定的。貌似我们对服务器发出的公钥有很强的信任。试想一下,客户端和服务器之间有个中间人,其也可以获取服务器发出的公钥,如果他拦截了服务器要发送给客户端的公钥,并伪造了一把公钥然后再发送给客户端,在客户端使用伪造的公钥加密 KEY 并发出后进行拦截,那么他就可以窃取到客户端生成的 KEY,从而可以获取到客户端与服务器之间通信的数据包中的用户信息,导致严重的后果。

那么,如何确保客户端收到的公钥是可信的呢?这就需要能够证明服务器身份的数字证书了。

采用 HTTPS 通信的服务器需要向第三方数字证书认证机构 (CA) 申请数字证书(需要付费,安全等级越高价格越贵),机构在进行审核后会颁发电子证书,同时产生一对公钥和私钥,私钥由服务器自己保存,公钥则附加在证书信息中,与证书一起公开。证书本身也带有一个电子签名,该签名用于校验证书的完整性和真实性,可以防止证书被篡改。

所以,在进行数据传输前会增加证书验证的过程。服务器接收到客户端的请求后,将数字证书发送给客户端,里面包含了公钥。客户端接收到证书后会对证书进行校验,校验不通过则会向用户提示警告信息。校验通过后则取出公钥并对 KEY 进行加密,然后发送给服务器,服务器接收到加密后的 KEY 以后使用私钥进行解密,然后客户端和服务器采用对称加密的方式进行数据传输,如下图所示。

在这里插入图片描述

5 参考链接

HTTPS 详解一:附带最精美详尽的 HTTPS 原理图 - SegmentFault 思否

相关文章:

  • 软件工程知识梳理2-需求分析
  • 离线使用Element UI和Vue
  • Spring Cloud Gateway
  • linux☞ Centos 基础篇
  • 【C++】构造函数和析构函数详解
  • python查询xml类别
  • 在JAVA中如何使用ASCLL码
  • go语言文件操作
  • 回归预测 | Matlab实现CPO-LSSVM冠豪猪算法优化最小二乘支持向量机多变量回归预测
  • JVM 执行引擎
  • Linux实验记录:使用iptables
  • 《Docker极简教程》--前言--Docker的简介
  • 【每日一题】6.LeetCode——轮转数组
  • 最新GPT4.0使用教程,AI绘画-Midjourney绘画,GPT语音对话使用,DALL-E3文生图+思维导图一站式解决
  • 代理模式(静态代理、JDK 动态代理、CGLIB 动态代理)
  • angular2 简述
  • Codepen 每日精选(2018-3-25)
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • node-glob通配符
  • nodejs实现webservice问题总结
  • Spring-boot 启动时碰到的错误
  • underscore源码剖析之整体架构
  • 缓存与缓冲
  • 检测对象或数组
  • 前端之React实战:创建跨平台的项目架构
  • 算法系列——算法入门之递归分而治之思想的实现
  • 微信小程序开发问题汇总
  • 微信小程序实战练习(仿五洲到家微信版)
  • 为什么要用IPython/Jupyter?
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 详解移动APP与web APP的区别
  • 一道闭包题引发的思考
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • #vue3 实现前端下载excel文件模板功能
  • (1)(1.13) SiK无线电高级配置(五)
  • (1)bark-ml
  • (1)安装hadoop之虚拟机准备(配置IP与主机名)
  • (js)循环条件满足时终止循环
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (图)IntelliTrace Tools 跟踪云端程序
  • .java 9 找不到符号_java找不到符号
  • .net 前台table如何加一列下拉框_如何用Word编辑参考文献
  • .NET 设计模式初探
  • .NET/C# 解压 Zip 文件时出现异常:System.IO.InvalidDataException: 找不到中央目录结尾记录。
  • /bin/bash^M: bad interpreter: No such file ordirectory
  • ?php echo ?,?php echo Hello world!;?
  • @vue/cli 3.x+引入jQuery
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [100天算法】-x 的平方根(day 61)
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)