代码编织梦想

原文 Baida | HTTPS explained with carrier pigeons

我的博客:[译] 用🐦信鸽来解释HTTPS🔐 - DobyAsa's

密码学是一个很难理解的学科,它里面全都是满满的数学证明。但其实如果你不是真的在开发一个密码系统,只是想要宏观地理解一下发生了什么的话,密码学里面很多复杂的东西是没有必要的。

如果你打开这个文章是想要创造出下一个 HTTPS 协议的话,我只能很抱歉地告诉你只靠鸽子可能是不够了... 但是如果不是的话,你可以煮一杯咖啡然后享受这篇文章了。

Alice,Bob 和... 鸽子?

你在网上进行的任何活动(比如读一篇文章,从淘宝上买一个东西,上传一张猫的图片)都可以归结为发送信息到服务器或者从服务器读取信息回来。
这个说法可能听起来很抽象,所以我们可以想象一下这些信息是由信鸽来送过去的。我知道这可能听起来非常的随意,但是相信我,实际上 HTTPS 工作起来跟这没什么两样,尽管 HTTPS 要快上不少。
同样的,我们用 Al­ice,Bob 和 Mal­lory 这三个人来代替服务器,客户端和黑客的角色。如果你不是第一次尝试了解加密的概念的话,你应该能够认出来这几个名字,因为这几个名字被广泛得使用在技术文章里面。

✉️ 第一次朴素的通讯

如果 Al­ice 想要给 Bob 发送信件的话,她可以直接把信件绑在信鸽的腿上然后让信鸽飞向 Bob。Bob 在接收到信后就可以愉快地阅读 Al­ice 发来的信息了。
但是如果 Mal­lory 在 Al­ice 的鸽子还在飞行的途中把信鸽拦截下来,然后偷偷篡改了信的内容怎么办?Bob 是无法知道 Al­ice 送来的信有没有在送来的途中被修改的。
上面其实就是 HTTP 工作的方式。看起来是不是很恐怖?我可不想我的银行凭证通过 HTTP 来发送,相信你们其实也不想这样。

🔑通过密码

那如果 Al­ice 跟 Bob 很聪明的话,他们可能就会用某种编码密钥来写信。比如他们可以将每个字母移动字母表上的三个位置。比如 D -> A, E -> B, F -> C。这样的话 "se­cret mes­sage" 就会被加密成 “pb­zobq jbp­pxdb”。
现在如果 Mal­lory 截获了信鸽的话,她没办法将信的内容改为其他有意义的内容内容,也没办法读懂信里写了什么了,因为她并不知道信是如何加密的。但是 Bob 是可以轻松地解密这个文本,只需要逆着加密方式来替换字母就行了。“pb­zobq jbp­pxdb” 就会被解密成 "se­cret mes­sage"。
所以这就成功了!
这种方式就叫做对称式密钥加密,因为如果你知道如何加密的话,那么你同样也知道该如何加密。
上面我描述的加密方式就是众所周知的凯撒密码。在现实生活中,我们会使用更加精妙,更加复杂的加密方式,但是基本思路是差不多的。

🔐 那我们怎么决定加密方式呢?

如果除了发送方和接收方之外没有人知道使用了什么密钥,那么对称密钥加密是非常安全的。在凯撒密码中,密钥是我们移动每个字母的数量的偏移量。在我们的示例中,我们使用了 3 的偏移量,但也可以使用 4 或 12。
问题是,如果 Al­ice 和 Bob 在开始用鸽子发送消息之前没有见面,他们就没有办法安全地建立一个密钥。如果他们把密钥放进信息里,Mal­lory 就会拦截信息并找到密钥。这将使 Mal­lory 可以在 Al­ice 和 Bob 开始加密他们的消息之前和之后按照自己的意愿读取或更改消息。
这是一个典型的中间人攻击的例子,唯一避免它的方式是整个改变这个加密系统。

🐦📦 带着盒子的鸽子

所以 Al­ice 和 Bob 想出来了一个更好的系统。当 Bob 想要给 Al­ice 写信的时候,他会按照以下步骤在进行:

  • Bob 放出一个没有携带任何信件的信鸽给 Alice。
  • Alice 放出一个信鸽,但是这个信鸽带的就不是信了,而是一个带着锁的盒子, Alice 寄出的盒子锁是打开的,锁的钥匙 Alice 自己留着。
  • Bob 将信放在盒子里,然后锁上锁发给 Alice。
  • Alice 收到了盒子,用自己的钥匙打开这个盒子,然后读取这个信件。
    这就是为什么 Mallory 拦截了信鸽也无法改变消息的内容,因为她没有钥匙来打开盒子。如果 Alice 想要给 Bob 发送信件也是相同的程序。
    Alice 跟 Bob 用的就是广为人知的非对称密钥加密。它之所以被叫做非对称,是因为尽管你能加密一个信息(锁上盒子),但是你不能够解密(打开盒子)。从技术上来说,盒子就是公钥而用来打开盒子的钥匙就是私钥

📦❓ 该如何相信这个盒子呢?

你可能也注意到了,我们这里依然有一个问题。当 Bob 收到 Al­ice 寄来的盒子的时候,他如何能确定这个盒子是 Al­ice 的盒子,而不是 Mal­lory 截获了鸽子后换的自己的盒子呢?
Al­ice 现在决定她会在盒子上签名,这样的话当 Bob 收到这个盒子的时候,他就可以检查这个签名然后知道是 Al­ice 给他寄的盒子。
这个时候你可能会想,那 Bob 一开始又是如何知道 Al­ice 的签名长什么样的呢?这是个好问题,Al­ice 跟 Bob 同样有这些问题,所以他们决定不是由 Al­ice 在盒子上签名,而是由另一个人 Ted 在盒子上签名。
那 Ted 又是谁呢?Ted 是一个非常出名的人,一个即出名又值得信任的人。Ted 把自己的签名给了所有人,而且所有人都相信他只会帮合法的人签名。
如果 Ted 能确定想找他帮忙签名的人就是 Al­ice 的话,那么 Ted 将只会给 Al­ice 的盒子签名。所以 Mal­lory 是没办法也搞到一个有 Ted 代表 Al­ice 签名的盒子,因为 Ted 只会给确认过身份的人签名。
Ted 从技术上来说扮演的就是 认证机构(CA)的角色,而你正在用来阅读这篇文章的浏览器带有各种认证机构的签名。
所以当你一开始连接一个网页的时候,你就信任了这个盒子,因为你相信 Ted,然后 Ted 告诉你这个盒子是可信的。

📦 盒子是很重的

Al­ice 和 Bob 现在有了一个可以信赖的系统用来通信,但是他们意识到了,让信鸽带着一个盒子飞行相对于只带着信来说实在是太慢了。
所以他们决定他们只会用盒子通信(非对称加密)来决定接下来该用哪种加密方式(对称加密)来加密🔐信封。
这样的话他们就能够各取其长。非对称式加密的可信赖与对称式加密的高效率。
当然在现实世界中不是用缓慢的信鸽来通信,不过用非对称式加密来加密信息始终还是比对称式加密要慢的,所以我们只使用它来交换编码密钥。
现在你已经知道 HTTPS 是如何工作的了,你的咖啡估计也已经好了。好好享用吧你受之无愧。😉

https 的故事_weixin_33712987的博客-爱代码爱编程

写在前面 缘于在 Twitter 上看到的 HTTPS explained with carrier pigeons,作者用很简单的故事就把 HTTP / HTTPS 的传输过程讲解的很清楚,这种精彩诠释应该被更多人看到。 借原文的意思,我重新写了这个故事,加上了一些配图和补充,请品尝 ... PS: 如果你想在任何地方使用本文以及文中

node.js event-loop事件循环-爱代码爱编程

Node.js Event-loop事件循环 Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高。 Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发。 Node.js 基本上所有的事件机制都是用设计模式中观察者模式实现。 Node.js 单线程类似进入一个while(tr

mongodb 基础命令速查指南-爱代码爱编程

MongoDB 是一个广泛使用的 NoSQL 数据库,以其灵活的数据模型、易于扩展和高性能而受到开发者的喜爱。本文将提供 MongoDB 的一些基本命令,包括数据库操作、集合操作和文档操作等,以帮助开发者快速入门 Mongo

linux环境shtool库下载/安装-爱代码爱编程

下载地址:gnu-shtool安装包下载_开源镜像站-阿里云 (aliyun.com) [root@pool-100-1-1-159 fun]# ll total 104 -rwxr--r--. 1 root sharing 97 Mar 17 17:35 myfuncs -rw-r--r-

websocket是什么?-爱代码爱编程

本次教程讲述WebSocket介绍及方法~ 前言 WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议;它的目的是要在浏览器和服务器之间建立一个不受限的双向通信的通道,比如服务器可以在任意时刻发送消息给浏览器; 与HTTP协议的不同 HTTP协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请

5、设备管理-爱代码爱编程

文章目录 1、I/O 设备的基本概念与分类1.1、什么是 I/O 设备1.2、按使用特性分类1.3、按传输速率分类1.4、按信息交换的单元分类1.5、整体框架 2、I/O 控制器2.1、I/O 设备的机械部件2.

http协议-爱代码爱编程

❣️关注专栏: JavaEE 初级HTTP 🍉 HTTP 协议格式🍉 抓包工具🍉 报文格式 🍉 HTTP请求🍉 URL🍉 GET 请求🍉 POST 请求🍉 GET 和 POST 的典型区别🍉 请求 "报头" (h

linux-inotify工具监控文件状态变化总结-爱代码爱编程

linux-inotify工具监控文件状态变化总结 大纲 1 安装2 使用 Inotify 它是在内核 2.6.13 版本中引入的一个新功能,它为用户态监视文件系统的变化提供了强大的支持,允许监控程序打开一个独立文件描

2023年网络安全比赛-爱代码爱编程

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 1.使用渗透机对服务器信息收集,并将服务器中网站服务端口号作为flag提交; 2.使用渗透机对服务器信息收集,将网站的名称作为flag提交; 3.使用渗透机对服务器渗透,将

【javaee初阶】第七节.网络原理tcp/ip协议-爱代码爱编程

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:JavaEE初阶 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!! 文章目录 前言 一、TCP/IP协议五层协议栈; 1.1 应用层协议; 二、传输层协议; 2.1 UDP协议; 2.2 TCP协议; 总结 前言 今天我们将学习有