【HTTPS】采用的加密策略, 什么是中间人攻击? 什么是证书?

文章目录

  • 前言
  • 一、认识 HTTPS 协议
    • 1, 对称加密
    • 2, 非对称加密
  • 二、HTTPS 加密策略
    • 1, 只采用对称加密 : 不安全
    • 2, 引入非对称加密
    • 3, 中间人攻击之偷梁换柱
    • 4, 引入证书
      • 4.1 什么是证书
      • 4.2, 证书如何能解决"中间人攻击"
  • 总结


前言

各位读者好, 我是小陈, 这是我的个人主页, 希望我的专栏能够帮助到你:
📕 JavaSE基础: 基础语法, 类和对象, 封装继承多态, 接口, 综合小练习图书管理系统等
📗 Java数据结构: 顺序表, 链表, 堆, 二叉树, 二叉搜索树, 哈希表等
📘 JavaEE初阶: 多线程, 网络编程, TCP/IP协议, HTTP协议, Tomcat, Servlet, Linux, JVM等(正在持续更新)

上篇文章介绍了如何构造一个 HTTP 请求, 本篇主要介绍关于 HTTPS 加密的的相关知识在这里插入图片描述


提示:是正在努力进步的小菜鸟一只,如有大佬发现文章欠佳之处欢迎批评指点~ 废话不多说,直接上干货!

一、认识 HTTPS 协议

目前绝大部分网站都使用了 HTTPS 协议, HTTPS 可以理解为在 HTTP 协议的基础上, 增加了一个加密层

正由于 HTTP 协议内容都是按照文本的方式明文传输的, 这就导致在传输过程中出现一些被篡改的情况, 比如被黑客盗取传输信息, 运营商劫持等等

HTTPS 就是尽可能确保互联网上的数据传输的安全性, 设计了加密机制

加密已经发展成复杂的, nb 的 “密码学”, 本篇不介绍具体的加密算法, 只介绍策略

  • 加密 : 明文, 通过一些复杂的数学算法(密匙) --> 密文
  • 解密 : 密文, 通过一些复杂的数学算法(密匙) --> 明文

1, 对称加密

简单来说 : 加密的密钥和解密的密钥是同一个, 所以采用对称加密, 密钥既能加密也能解密

我们把对称密钥称为 Key :

  • 加密 : 明文 通过 Key --> 密文
  • 解密 : 密文 通过 Key --> 明文

2, 非对称加密

简单来说 : 有两把密匙, 一把对外公开的公钥, 一把不对外公开的私钥, 公钥和私钥配对, 公钥用来加密, 私钥来解密

我们把公钥称作 publicKey, 私钥称作 privateKey

  • 加密 : 明文 通过 publicKey --> 密文
  • 解密 : 密文 通过 privateKey --> 明文

注意 : 公钥和私钥是配对的, 也是相对的!!! 这两把密匙, 都可以用来加密或者解密, 完全可以使用私钥加密, 使用公钥解密, 只是把用来加密的密钥公开, 用来解密的密钥私有, 这才有了公钥私钥之分

非对称加密的好处就是 : 即便别人知道我加密的方式, 也不能解密, 只能干瞪眼!!, 因为解密需要私钥啊, 私钥是我私藏的, 只有我知道

但坏处是 : 由于公钥私钥设计成配对的, 导致加密解密时运算复杂, 比较耗时


二、HTTPS 加密策略

接下来, 我们层层递进的分析 HTTPS 如何尽可能保证数据安全

1, 只采用对称加密 : 不安全

我们把对称密钥称为 Key :

  • 加密 : 明文 通过 Key --> 密文
  • 解密 : 密文 通过 Key --> 明文

使用对称加密的方式传输密文 :

在这里插入图片描述

这样即便是中间有黑客, 黑客截取到了数据, 如果没有拿到密钥 Key, 也无法解密, 但同理, 服务器如果没有拿到密钥 Key, 服务器也无法解密

所以在此之前, 客户端要先把 Key 传给服务器

对称加密的密钥 Key, 是客户端生成的, 因为一个服务器可能要和无数个客户端通信, 每个客户端的密钥 Key 都不能相同, 这就需要客户端自己生成自己的密钥 Key

在这里插入图片描述
这样确实是把 Key 告知给服务器了, 接着再传输密文, 服务器就可以解密了, 但同理黑客也知道了 Key ! 黑客也能解密 ! ! 因为 Key 是明文传输的 ! !

那咋办呢? 想让客户端知道 Key, 又不想让黑客知道, 难道再生成一个 Key2, 用 Key2 加密 Key 吗? 如果可以, 那 Key2 怎么传输? 显然这是套娃

所以此路不通, 问题是Key 无法安全传输, 这就需要引入非对称加密 ! !


2, 引入非对称加密

我们把公钥称作 publicKey, 私钥称作 privateKey

  • 加密 : 明文 通过 publicKey --> 密文
  • 解密 : 密文 通过 privateKey --> 明文

对称密钥 Key 是客户端生成的, 非对称密钥是服务器生成的(公钥对外公开, 私钥只有服务器自己知道)

非对称加密可以做到客户端安全的传输 Key , 不被黑客截取 ! !

在这里插入图片描述

首先, 客户端有一个对称密钥 Key, 服务器有一对儿非对称密钥 publicKey 和 privateKey

1, 客户端获取 publicKey

在这里插入图片描述
黑客没拿到有用的信息, 只能转发消息


2, 服务器返回 publicKey

在这里插入图片描述
客户端收到信息, 拿到了 publicKey , 但黑客也拿到了


3, 客户端使用非对称加密传输 Key

在这里插入图片描述
注意 ! ! !
此时 Key 不再是明文传输了, 而是被服务器的 publicKey 加密了, 即便黑客截取了这个被加密的 Key, 也不能解密, 因为解密需要与 publicKey 配对的 privateKey ! ! 所以即便刚刚黑客截取了服务器发给客户端的 publicKey 也无用武之地

黑客没有 privateKey, 客户端也没有, 除了服务器之外的任何一台主机都没有 ! ! 所以只有服务器(使用 privateKey 解密之后)知道客户端的对称密钥 Key 是什么


4, 客户端使用对称加密传输数据

在这里插入图片描述
服务器拿到 Key 之后, 后续客户端通过 Key 加密数据, 服务器自然也可以使用 Key 解密


综上所述,
1, 原本客户端只有 Key, 服务器只有 publicKey 和 privateKey, 但最后客户端拿到了对方的 publicKey, 服务器安全的拿到了对方的 Key
2, 非对称加密传输 Key, 对称加密传输数据报, 因为非对称加密比较费时, 只使用一次就可以后续安全地频繁使用性能更高地加密方式

但是, 这就万事大吉了吗? 黑客也有"骗"的方式


3, 中间人攻击之偷梁换柱

起初还是客户端有一个对称密钥 Key, 服务器有一对儿非对称密钥 publicKey 和 privateKey

1, 客户端获取 publicKey

在这里插入图片描述
黑客没拿到有用的信息, 只能转发消息


2, 服务器返回 publicKey, 黑客偷梁换柱 ! !

在这里插入图片描述
当黑客拿到了服务器打算发给客户端的 publicKey 之后, 黑客做坏事了 : 自己生成了一对 publicKey 和 privateKey, 把自己的 publicKey 发给客户端, 让客户端以为黑客的 publicKey 就是服务器发给他的 publicKey

在这里插入图片描述

此时黑客手上有三把密匙 : 自己的 publicKey , privateKey, 和服务器的 publicKey


3, 客户端使用非对称加密传输 Key

在这里插入图片描述
客户端完全不知道发生了什么, 使用黑客的 publicKey 加密 Key 传输给服务器, 被黑客拦截后, 黑客可以使用自己的 privateKey 解密, 从而盗取 Key

如果原封不动的转发给服务器, 服务器无法解密了(因为不是使用服务器的 publicKey 加密的, 服务器的 privateKey 就用不了)

为了防止服务器发现异常, 黑客就要把 Key 使用服务器的 publicKey 加密, 发给服务器

在这里插入图片描述

此时黑客手上有四把密匙 : 自己的 publicKey , privateKey, 服务器的 publicKey, 和客户端的对称密钥 Key


4, 客户端使用对称加密传输数据

在这里插入图片描述

由于黑客已经有了对称密钥 Key, 等客户端傻呵呵的发来了使用 Key 加密的密文, 黑客也能解开, 从而盗取数据


上述过程, 被称作中间人攻击
1, 黑客骗过了客户端, 让客户端以为自己的 publicKey 就是服务器的 publicKey, 所以黑客才能盗取客户端的 Key, 其实本质就是黑客冒充了服务器的身份
2, 自始至终, 客户端都没能拿到服务器的 publicKey

解决中间人攻击的方式也很简单, 在客户端拿到 publicKey 的时候, 必须要让客户端信任这个 publicKey 是正品, 然后才能把自己的对称密钥 Key 交出去


4, 引入证书

4.1 什么是证书

服务器要想支持 HTTPS 协议, 就要找到证书颁布机构申请一个证书, 证书不是实体的, 可以理解成一个结构化的字符串, 里面包含了以下信息 :

  • 证书发布机构
  • 证书有效期
  • 证书所有者
  • 证书所有者的公钥
  • 加密的签名(除了这个, 其他的字段都是明文的)

签名就是一个"校验和", 针对证书中的各种字段, 使用特殊的算法得出一个值, 然后再用证书颁布机构的私钥对签名加密

证书颁布机构也有一对公钥和私钥, 任何一个正经的主机的操作系统中都内置了机构的公钥

上面说过, 公钥可以加密, 私钥解密, 也可以私钥加密, 公钥解密, 只是对外公开的称作公钥

在浏览器 – 设置 – 搜索"证书" – 证书管理 :

在这里插入图片描述
在这里插入图片描述


4.2, 证书如何能解决"中间人攻击"

客户端可以通过以下方式判断证书是不是"正品" :

  • 证书的有效期是否过期
  • 证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构)
  • 证书是否被篡改 : 客户端从系统中拿到该证书发布机构的公钥, 对签名解密, 得到一个 hash 值(称为数据摘要), 这是机构已经算好的, 设为 hash1. 然后客户端使用相同的算法, 计算整个证书的 hash 值, 设为 hash2, 这是客户端自己算的. 对比 hash1 和 hash2 是否相等. 如果相等, 则说明证书是没有被篡改过的

在这里插入图片描述

有了证书之后, 客户端直接向服务器索要证书即可, 因为证书里包含服务器的私钥

**加粗样式**

黑客要是还想再用刚才的方式"偷梁换柱", 就不行了, 因为客户端首先能看到的就是黑客发来的 publicKey证书里的 publicKey 不一样

黑客能不能篡改证书里的 publicKey, 篡改证书所有者呢?

  • 证书本质就是个字符串, 黑客当然可以把篡改字符串里的值, 黑客的操作系统中也有机构的公钥, 所以也可以轻松的把加密的签名使用发布机构的公钥解密, 然后篡改签名
  • 但是黑客无法再针对篡改后的签名加密, 因为黑客没有发布机构的私钥 ! !, 这一步做不到, 签名的值就无法真正的被修改, 即便改了其他字段, 等到客户端自己校验的时候就会发现不对劲

所以黑客完全能看到证书里的所有信息, 但是改不了, 无能为力, 只能干瞪眼


总结

以上就是本篇的全部内容, 主要介绍了 HTTPS 是如何保证数据安全传输的, 仅仅使用对称加密, 无法安全传输 Key, 使用非对称加密即可, 但会有"中间人攻击"风险, 所以引入证书, 通过校验证书能够判断对端是否值得信任, 整个复杂的机制都是为了确保安全的传输Key, 然后才能传输数据

如果本篇对你有帮助,请点赞收藏支持一下,小手一抖就是对作者莫大的鼓励啦😋😋😋~


上山总比下山辛苦
下篇文章见

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

文件打包解包的方法

文件打包 前言 在很多情况下,软件需要隐藏一些图片,防止用户对其更改,替换。例如腾讯QQ里面的资源图片,哪怕你用Everything去搜索也搜索不到,那是因为腾讯QQ对这些资源图片进行了打包,当软件运行的时候解…

动态地图开发的未来应用场景有哪些?

动态地图开发应用已经成为现代数字世界中不可或缺的一部分。这种技术的灵活性为公司和组织提供了一种简单却强大的方式,以在现实世界地图上显示各种信息。无论是用于自动导航系统、气象预报、实时交通状况或利用商业洞察力获取市场数据,动态地图开发应用…

SpringBoot整合网易邮箱

SpringBoot整合邮箱 1&#xff0c;开启POP3/SMTP/IMAP服务 注意&#xff1a;每个邮箱的密码唯一&#xff0c;不要随意分享给他人 最后就是这个样子了 2&#xff0c;整合测试 2.1&#xff0c;pom.xml <?xml version"1.0" encoding"UTF-8"?> <…

【教程】解决php微擎中的goto加密解密,一键解密工具

今天&#xff0c;我将向大家揭秘一款神奇的工具——goto解密工具&#xff0c;轻松解密这个看似棘手的问题。 无数开发者都曾因为php中的goto功能而头疼不已。goto解密工具其中之一就是解密goto代码。通过精妙的算法和强大的解析能力&#xff0c;它能够解密被goto加密的代码段&…

Tune-A-Video:用于文本到视频生成的图像扩散模型的One-shot Tuning

Tune-A-Video: One-Shot Tuning of Image Diffusion Models for Text-to-Video Generation Project&#xff1a;https://tuneavideo.github.io 原文链接&#xff1a;Tnue-A-Video:用于文本到视频生成的图像扩散模型的One-shot Tuning &#xff08;by 小样本视觉与智能前沿&…

Redis基础认识

日升时奋斗&#xff0c;日落时自省 目录 1、Redis安装及配置 2、缓存简介 2.1、缓存优点 2.2、缓存分类 2.3、常见缓存使用 2.3.1、Spring Cache 2.3.2、Redis 3、Redis数据类型和使用 3.1、字符串类型 3.2、哈希类型 3.3、列表类型 3.4、集合类型 3.5、有序集合类…

基于 unity 配置 adb

1.打开环境变量配置path的环境 2 找到自己的unity安装目录,找到对应路径 配置到 path 属性中 C:\~\Editor\2021.3.0f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\SDK\platform-tools 3 应用保存即可

42. 接雨水

题目链接&#xff1a;力扣 解题思路&#xff1a;从左往右按列进行计算&#xff0c;依次计算每一列能够接到的雨水数量。对于当前列能够接到的雨水数量是由左右两边最高的两根柱子决定的&#xff0c;类似于木桶定律&#xff08;一只水桶能装多少水取决于它最短的那块木板&#x…

TypeScript 中接口类型【Interfaces】的定义使用解读

导语&#xff1a; 什么是 类型接口&#xff1f; 在面向对象语言中&#xff0c;接口&#xff08;Interfaces&#xff09;是一个很重要的概念&#xff0c;它是对行为的抽象&#xff0c;而具体如何行动需要由类&#xff08;classes&#xff09;去实现&#xff08;implement&#x…

Redis的3大特殊数据类型(1)-BitMap

BitMap(位图/位数组)是Redis2.2.0版本中引入的一种新数据类型&#xff0c;该数据类型本质是一个仅含0和1的二进制字符串。因此可以把 Bitmap 想象成一个以位为单位的数组&#xff0c;数组的每个单元只能存储 0 和 1&#xff0c;数组的下标在 Bitmap 中叫做偏移量 offset&#x…

AI绘画Midjourney的咒语关键词汇总结

近期很多人都在研究Ai,被他强大的运算和准确性所震撼&#xff0c;和我们设计师相关的一个Ai绘画工具-Midjourney&#xff0c;绝对是占设计圈头部流量的&#xff0c;在圈内掀起一片热潮&#xff0c;今天我们就专门围绕他来展开说说&#xff0c;当然除了这个外&#xff0c;我们还…

使用 Jetpack Compose 构建 Switch

欢迎来到这篇关于如何使用 Jetpack Compose 构建 Switch&#xff08;开关&#xff09;的博客。Jetpack Compose 是 Google 的现代 UI 工具包&#xff0c;主要用于构建 Android 界面。它以声明式的方式简化了 UI 的开发。 一、什么是 Switch&#xff1f; 在 Android 中&#xf…