HTTPS,SSL(对称加密和非对称加密详解)

上一篇博客( HTTP详解_徐憨憨!的博客-CSDN博客)详细讲解了关于HTTP的知识,了解到 HTTP协议下的数据传输是一种明文传输,既然是明文传输,可能导致在传输过程中出现一些被篡改的情况,此时就需要对所传输的数据进行加密,达到数据安全的效果,所以在HTTP协议的基础上引入了另一种应用层协议——HTTPS协议(升级版的HTTP协议)!

一,HTTP中的“运行商劫持”问题

我们通过网络传输的任何数据包都会经过运营商的网络设备(路由器,交换机等),由于是明文传输,那么我们的数据对于运营商网络设备来说就是公开的,运营商的网络设备就可以解析出传输的数据内容,从而进行数据篡改,如图所示:

不止运营商可以劫持,其他黑客也可以用类似的手段进行劫持,来窃取用户隐私信息或者篡改内容,如果黑客在用户登录支付宝的时候获取到用户账户余额,甚至获取到用户的支付密码,后果不堪设想,所以明文传输是比较危险的事情!

二,HTTPS

  1. HTTPS的加密

1.概念

为了避免HTTP协议明文传输数据的危险,HTTPS协议在HTTP协议的基础上进行了加密,进一步的来保护用户的信息安全。

2.加密

加密就是把明文(要传输的信息)进行一系列变换,变成密文

解密就是把密文再进行一系列变换,还原成明文

在这个加密和解密的过程中,往往需要一个或者多个中间的数据,辅助进行这个过程,这样的数据称为密钥!

2.HTTPS的工作过程

既然要保证数据的安全,就需要进行“加密”,网络传输中不再直接传输明文了,而是加密之后的“密文”,加密的方式有很多,但是整体可以分成两大类:对称加密和非对称加密!

对称加密

对称加密其实就是通过同一个“密钥”,把明文加密成密文,并且也能把密文解密成明文

一个简单的对称加密, 按位异或
假设明文 a = 1234, 密钥 key = 8888
则加密 a ^ key 得到的密文 b 为 9834.
然后针对密文 9834 再次进行运算 b ^ key, 得到的就是原来的明文 1234.
(对于字符串的对称加密也是同理, 每一个字符都可以表示成一个数字)
当然, 按位异或只是最简单的对称加密. HTTPS 中并不是使用按位异或,HTTPS中更复杂

引入对称加密后,即使数据被截获,由于黑客不知道密钥是啥,因此就无法进行解密,也就不知道请求的真是内容是什么了,但是密钥从何而来呢?服务器还是客户端呢?假设客户端生成一个密钥,此时客户端就需要把密钥告知服务器:

客户端生成密钥发送给服务器,由于密钥刚刚生成,服务器还不知道,密钥只能明文传输,此时密钥可能就被黑客给截获了,一旦黑客获取到了密钥,后续对传输的数据进行加密操作都可以被黑客解密,因此密钥的传输也必须加密传输!

但是要想对密钥进行对称加密,就仍然需要先协商确定一个“密钥的密钥”,这就变成了“无限套娃”的问题了,此时密钥的传输就不也可以用对称加密,就需要引入非对称加密!

非对称加密

非对称加密要用到两个密钥,一个叫做“公钥”,一个叫做“私钥”;

公钥和私钥是配对的,最大的缺点就是运算速度非常慢,比对称加密要慢很多。

通过公钥对明文加密, 变成密文;
通过私钥对密文解密, 变成明文.
反过来也可以:
通过私钥对明文加密, 变成密文;
通过公钥对密文解密, 变成明文.
  • 客户端在本地生成对称密钥,通过公钥加密,发送给服务器;

  • 由于中间设备密钥私钥,即使截获了数据,也无法还原出内部的原文,也就无法获取到对称密钥;

  • 服务器通过私钥解密,还原出客户端发送的对称密钥,并且使用这个对称密钥加密给客户端返回的响应数据;

  • 后续客户端和服务器的通信都只用对称加密即可,由于该密钥只有客户端和服务器两个主机知道,其他主机/设备不知道密钥,即使截获数据也没有意义;

  • 由于对称加密的效率非常比非对称加密高很多,因此只是开始阶段协商密钥的时候使用非对称加密,后续的传输操作让然使用对称加密.

现在的加密方式还存在一个小问题:

  1. 客户端如何获取到公钥?

  1. 客户端如何确定这个公钥不是黑客伪造的?

引入证书

在客户端和服务器刚一建立连接的时候,服务器给客户端返回一个证书,这个证书包含了刚才的公钥,也包含了网站的身份信息.

当客户端获取到这个证书之后,会对证书进行校验(防止证书是伪造的)

  • 判定证书的有效期是否过期;

  • 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构);

  • 验证证书是否被篡改:从系统拿到证书发布机构的公钥,对签名解密,得到一个hash值(称为数学摘要),设为hash1,然后计算整个证书的hash值,设为hash2,对比hash1和hash2是否相等,如果相等,则说明证书是没有被篡改过.

总结

HTTPS工作过程涉及到的密钥有三组:

第一组(非对称加密): 用于校验证书是否被篡改. 服务器持有私钥(私钥在注册证书时获得), 客户端持有公

钥(操作系统包含了可信任的 CA 认证机构有哪些, 同时持有对应的公钥). 服务器使用这个私钥对证书的

签名进行加密. 客户端通过这个公钥解密获取到证书的签名, 从而校验证书内容是否是篡改过;

第二组(非对称加密): 用于协商生成对称加密的密钥. 服务器生成这组 私钥-公钥 对, 然后通过证书把公钥

传递给客户端. 然后客户端用这个公钥给生成的对称加密的密钥加密, 传输给服务器, 服务器通过私钥解密

获取到对称加密密钥;

第三组(对称加密): 客户端和服务器后续传输的数据都通过这个对称密钥加密解密.

其实一切的关键都是围绕这个对称加密的密钥. 其他的机制都是辅助这个密钥工作的:
第二组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器;
第一组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/853.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB | 给热图整点花哨操作(三角,树状图,分组图)

前段时间写的特殊热图绘制函数迎来大更新,基础使用教程可以看看这一篇: https://slandarer.blog.csdn.net/article/details/129292679 原本的绘图代码几乎完全不变,主要是增添了很多新的功能!!! 工具函数完…

【链表OJ题(六)】链表分割

​ ​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯长路漫漫浩浩,万事皆有期待 文章目录链表OJ题(六)1. 链表…

燕山大学-面向对象程序设计实验-实验三 类和对象—构造函数与析构函数-实验报告

CSDN的各位友友们你们好,今天千泽为大家带来的是燕山大学-面向对象程序设计实验-实验三 类和对象—构造函数与析构函数,接下来让我们一起进入c的神奇小世界吧,相信看完你也能写出自己的 实验报告!如果对您有帮助的话希望能够得到您的支持和帮助,我会持续更新的!🚀3.…

硬刚ChatGPT!文心一言能否为百度止颓?

引言:近年来,人工智能领域的发展突飞猛进,尤其是在自然语言处理(NLP)方面。OpenAI的ChatGPT无疑是这个领域的佼佼者[1]。那么,面对这样一款高度智能的AI模型,国内市场上是否有相应的产品能与之抗…

你是真的“C”——指针进阶知识分享【上篇】

你是真的“C”——指针进阶知识分享【上篇】😎前言🙌指针初阶必备小知识~😊一. 字符指针😊二. 指针数组😊三、数组指针😊数组指针的定义😘四、 &数组名VS数组名😊总结撒花&#…

【K8S系列】从零开始学习 k8s:入门指南(二)

目录 序言 前情提要: 4.K8S架构 4.1 声明式系统VS命令式系统 4.2 k8s-声明式系统 4.2.1 声明方式-yaml 4.3 Kubernetes的基本概念 1.集群 2.节点 3.容器 4.Pod 5.Service 6.Deployment 问题: 4.4 K8S核心组件 4.4.1 kube-apiserver 4.4…

【Linux学习】进程间通信——system V(共享内存 | 消息队列 | 信号量)

🐱作者:一只大喵咪1201 🐱专栏:《Linux学习》 🔥格言:你只管努力,剩下的交给时间! 进程间通信——共享内存 | 消息队列 | 信号量🏀共享内存⚽系统调用shmgetkey值⚽系统…

提升Python代码性能的六个技巧

文章目录前言为什么要写本文?1、代码性能检测1.1、使用 timeit 库1.2、使用 memory_profiler 库1.3、使用 line_profiler 库2、使用内置函数和库3、使用内插字符串 f-string4、使用列表推导式5、使用 lru_cache 装饰器缓存数据6、针对循环结构的优化7、选择合适算法…

【WEB前端进阶之路】 HTML 全路线学习知识点梳理(下)

前言 本文是HTML零基础小白学习系列的第三篇文章,点此阅读 上一篇文章 文章目录前言十五.HTML布局1.使用div元素添加网页布局2.使用table元素添加网页布局十六.HTML表单和输入1.文本域2.密码字段3.单选按钮4.复选框5.提交按钮十七.HTML框架1.iframe语法2.iframe设置…

Windows电脑密码忘记解决方法

目录 背景 方法一 方法二 方法三 方法四 方法五 背景 个人电脑忘记了密码,无法登录用户界面。 方法一 1. 开机时常按 F11,如果是Win10一下系统,就常按 F8,知道出现一下图状 2. 选择疑难解答,再选择高级选项 3.…

Tomcat前端页面部署

一,Tomcat的安装1.Tomcat是什么Tomcat是一个HTTP服务器,HTTP协议是HTTP客户端和HTTP服务器之间交换数据的格式,我们可以通过ajax和Java Socket分别构造HTTP客户端,同时HTTP服务器也可以通过Java Socket来实现,而Tomcat…

React项目规范:目录结构、根目录别名、CSS重置、路由、redux、二次封装axios

React项目(一)一、创建项目二、目录结构三、craco配置别名并安装less1.craco安装2.配置别名3.安装less四、CSS样式重置五、配置路由六、配置Redux1.创建大仓库2.创建小仓库(1)方式1:RTK(2)方式2…

toString()、equals()是什么,为啥需要重写,多种方法来重写

https://m.runoob.com/java/java-object-class.html toString() 1.为什么会有toString 子类继承父类就可以使用父类所有非私有的属性的方法。 在Java中所有类都直接或者间接继承Object类,可以说只要是Object类里面定义的非私有的属性和方法,任何类都可…

Linux上如何使用Stable Diffusion WebUI

在我把所有的坑都踩了一遍之后,决定记录一下linux上的Stable Diffusion webui是怎么搞的。 前提条件 已安装CUDA 已安装git 已安装Anaconda 直接安装Anaconda不要指望Linux自带的Python。虽然Linux自带的Python,但是缺胳膊少腿,所以还是直接…

IntelliJ IDEA创建Servlet

目录 ——————————————————————————————— 一、创建Java项目 1、创建java项目 2、选择java 3、next 4、给项目命名 5、新创建完java项目的目录结构 二、变java为servlet项目 1、变servlet项目 2、选择Web Application 3、更新完成后的目录…

尚融宝04-mybatis-plus插件和条件构造器

目录 一、分页插件 1、添加配置类 2、添加分页插件 3、测试分页 二、XML自定义分页 1、UserMapper中定义接口方法 2、定义XML 3、测试 三、乐观锁 1、场景 2、乐观锁方案 3、乐观锁实现流程 4、优化流程 四、wapper介绍 1、Wrapper家族 2、创建测试类 五、Qu…

Linux驱动开发

一、驱动分类Linux中包含三大类驱动:字符设备驱动、块设备驱动和网络设备驱动。其中字符设备驱动是最大的一类驱动,因为字符设备最多,从led到I2C、SPI、音频等都属于字符设备驱动。块设备驱动和网络设备驱动都要比字符设备驱动复杂。因为其比…

线程的状态

目录 1.线程状态的种类 2.线程的状态图 3.状态的详细说明 1.线程状态的种类 初始(NEW):新建一个线程,但还没有调用start方法 运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态统称为"运行".线程对象创建后,其他线程调用了该对象的start()方法.该…

抽丝剥茧还原真相,记一次神奇的崩溃

作者:靳倡荣 本文详细回放了一个崩溃案例的分析过程。回顾了C多态和类内存布局、pc指针与芯片异常处理、内存屏障的相关知识。 一、不讲“武德”的崩溃 1.1 查看崩溃调用栈 客户反馈了一个崩溃问题,并提供了core dump文件,查看崩溃调用栈如下…

大数据-重新学习hadoop篇(第一天)-未完成

前言:首先这次重新学习为了后面校招,我会把我每天复习学到的一些觉得重要的知识点进行总结下来,持续更新,为实习做准备,加深记忆,从今天开始可能就不会法leetcode的相关题解了,但是每天还是会做…