用信鸽来讲解HTTPS的知识
加密是一个很难理解的东西,这里头满是数学证明。不过,除非你是在开发一个加密系统,否则无需了解那些高阶的复杂知识。
如果你看这篇文章是为了创造下一个 HTTPS 协议,很抱歉,请出门左走,鸽子是远远不够的。不然的话,先去煮一壶咖啡,再来看文章吧~
爱丽丝、鲍勃以及鸽子?
你在网络上进行的任何活动(阅读这篇文章、在京东上购物、分享猫咪的照片),都是通过服务器发送和接收信息。
这可能有点抽象。那就让我们设想这些信息都是通过信鸽传播的。看起来可能有点奇怪,不过请相信我,HTTPS 的工作原理和信鸽是一样的,只是要快得多。
同样,我们用爱丽丝、鲍勃以及马洛里来代称服务器、客户机以及黑客。如果之前你尝试过理解加密系统的原理,那这些名字你不会感到陌生,因为他们在技术文献中经常出现。
第一次简单的通信
如果爱丽丝想要和鲍勃通信,她会将信件绑在信鸽的腿上,然后信鸽带着爱丽丝的信飞到鲍勃那里去。鲍勃收到信后,知道了爱丽丝对她的爱意。到目前为止,一切看起来都还不错。
但要是马洛里在途中拦截下正在飞行的鸽子,然后将信件内容篡改了呢?鲍勃不会知道爱丽丝写来的这封信在途中是被篡改过的。
这就是 HTTP 的工作方式。很恐怖吧?所以,我不会通过 HTTP 发送我的银行卡信息,你也不应该这样做。
加密
假设爱丽丝和鲍勃非常的狡猾,他们约定好以一种密文的形式写信。他们将每个字母在字母表上移动三个位置,例如:D —> A,E —> B,F —> C。而诸如 “secret message” 这样的句子,就会变成 “pbzobq jbppxdb”。
如果马洛里再次拦截下鸽子,并试图篡改信件内容。他会无从下手,因为她不知道密文的规则,即便改了也会毫无意义,令人不知所云。但是鲍勃会根据密文的规则轻松的解读出信件的内容,也就是 A —> D,B —> E,C — > F。加密的句子 “pbzobq jbppxdb” 会被解密成 “secret message”。
酷毙了!
这就是对称加密(symmetric key cryptography),因为你知道了如何加密也就知道了如何解密。
上面举例的加密方法就是非常有名的凯撒密码(Caesar cipher)。在现实生活中,我们使用的是更加酷更加复杂的加密方法,但主要的原理都是一样的。
如何确定加密规则?
除了发送者和接受者,没有其他人知道加密规则,在这种情况下,对称加密是非常安全的。在凯撒密码中,加密的关键在于每个字母移动的偏移量。在我们的例子里,偏移量设定为3,但也可以是4或者12。
问题在于,如果爱丽丝和鲍勃在用鸽子通信之前从未谋面,他们就没有安全的办法来制定加密规则。如果他们把加密规则写在信里通过鸽子传递,马洛里就可以拦截鸽子从而窃取加密规则。之后,每次爱丽丝和鲍勃通的信,马洛里都可以拦截下并且通过他们的加密规则去破解和修改。
这就是典型的中间人攻击,避免它的唯一办法就是同时更改加密系统。
携带盒子的信鸽
因此,爱丽丝和鲍勃制定了一个更加安全的加密系统。当鲍勃要发送信息给爱丽丝时,他会进行如下步骤:
- 鲍勃给爱丽丝寄去一只鸽子,鸽子没有携带任何信件。
- 爱丽丝在鸽子腿上绑了一个带锁但是没有上锁的盒子,钥匙保存在自己手里,然后将鸽子寄回给鲍勃。
- 鲍勃把信件放在盒子里,上锁。鸽子又飞回到爱丽丝那里。
- 爱丽丝收到鸽子后,用手中的钥匙打开盒子,然后表情愉悦的看鲍勃写给她的情书。
这样一来,马洛里因为没有盒子的钥匙,即便拦截下鸽子也无法修改信件内容。当爱丽丝要给鲍勃写信时,遵循的也是以上这些步骤。
爱丽丝和鲍勃使用的这种新的加密方式通常叫做非对称加密(asymmetric key cryptograpy)。为啥叫做非对称呢?因为即便你知道如何加密(给盒子上锁),你也没有办法解密(打开盒子的锁)。在技术上,这个盒子就是公钥(public key),而打开盒子的钥匙叫做私钥(private key)。
为啥要相信这个盒子?
如果你看的很认真,那么可能会注意到一个问题。当鲍勃收到没有上锁的盒子,他怎么确定这个盒子没有被马洛里调包呢?
爱丽丝决定给盒子签名,当鲍勃收到盒子后检查上面的签名就可以知道盒子是不是爱丽丝发过来的那个。
有些人可能会想,鲍勃如何第一时间识别出爱丽丝的签名呢?好问题!爱丽丝和鲍勃也想到了这个麻烦,所以他们决定,让特德在盒子上签名,爱丽丝不用签了。
特德是何方神圣?特德是一个众所周知并且相当值得信赖的家伙。特德可以在任意盒子上签名,大家都很信任特德,因为他只给那些合法的朋友所持有的盒子签名。
特德会给爱丽丝的盒子签名,是因为他确定这个请求签名的人是真的爱丽丝。所以,马洛里无法把自己的盒子伪装成是爱丽丝的盒子,因为鲍勃会知道这个是假的,上面没有特德的签名。
在技术上,特德指的是证书颁发机构。你用来看这篇文章的浏览器里就附带了来自于各个证书颁发机构的签名。
所以,当你第一次访问某个网站,之所以信任他的盒子,是因为信任特德,特德告诉你盒子是合法的。
盒子很重啊
现在,爱丽丝和鲍勃终于有了一个安全可靠的系统去进行通信。但同时,他们也意识到携带盒子的鸽子比只携带信息的鸽子飞行起来要慢好多。
他们决定只在发送和接收关于制定加密规则(还记得凯撒密码吗?)的信息的时候使用盒子加密(非对称加密)。
通过这种方式,他们既得到了非对称加密的可靠性,又兼顾了对称加密的高效率。双赢!
在现实世界,不存在慢鸽子。尽管如此,通过非对称加密方式加密信息依然比用对称加密方式要慢,所以我们只用这种加密方式来交换密钥。
好啦,你的咖啡应该煮好了, HTTPS 是如何工作的你也知道了。去喝吧,你值得来一杯。
翻译自 HTTPS explained with carrier pigeons
用信鸽来讲解HTTPS的知识的更多相关文章
- HTTPS协议详解(一):HTTPS基础知识
HTTPS基础知识:HTTPS (Secure Hypertext Transfer Protocol)安全超文本传输协议,是一个安全通信通道,它基于HTTP开发用于在客户计算机和服务器之间交换信息. ...
- HTTPS加密协议详解(一):HTTPS基础知识
转自:https://blog.csdn.net/hherima/article/details/52469267------------------------------专栏导航:-------- ...
- 【转】用信鸽来解释 HTTPS
一.引文出处 注:分享交流技术.本文摘自开源中国翻译,翻译者:JonnHuang,句号句号 译文原网址:https://www.oschina.net/translate/https-explaine ...
- 用信鸽来解释 HTTPS
原文:http://blog.jobbole.com/113883/ ----------------------------------------------------------------- ...
- HTTPS相关知识以及在golang中的应用
最近简单学习了HTTPS,并在golang中实践了一下,现在把学到的知识记录下来,方便以后查看,如果有幸能帮到有需要的人就更好了,如果有错误欢迎留言指出. 一些简单的概念,可以自行百度百科 HTTPS ...
- https相关知识总结
从园子里看到很多讲解不错的文章,将链接放到这里,备忘 浅析数字证书:https://www.cnblogs.com/hyddd/archive/2009/01/07/1371292.html
- HTTPS证书知识扫盲
1. 前言 现在搞网站域名不加个HTTPS就显得不专业,特别在使用JWT进行认证的接口一定要加HTTPS为你的接口增加一层安全屏障.今天就来聊聊配置HTTPS的关键SSL证书,也被称为CA证书. 2. ...
- ios 中使用https的知识
先看文章,这篇文章说的是使用AFNetworing进行https时的事项,十分好!http://blog.cnbang.net/tech/2416/ ios中使用https,主要就是使用NSURLCr ...
- [skill][https][ssl/tls] HTTPS相关知识汇总
结论前置: A 身份验证 证书, 服务器证书 B 密钥协商 RSA DHE / ECDHE PSK C 加密通信 加密通信采用对称加密,使用B阶段协商出来的密钥. B 阶段如果使用 RSA 协 ...
随机推荐
- Vue以CDN方式调用Swiper轮播异常
问题概览: 有一个小型单页应用项目,嫌用组件式调用vue-swiper麻烦,因此以CDN的方式调用swiper,结果轮播的图不动了! 爬了半天百度和谷歌都无解决方案,最后曲线救国的方式解决了问题. 解 ...
- Windows窗体数据抓取详解
最近在客户项目上刚好遇到一个问题,项目需求是要获取某台机床的实时状态,问题点刚好就在于该机床不是传统意义上的数控机床,也不是PLC控制器,只有一个上传下载程序文件的应用程序,上面刚好有几个按钮可以大概 ...
- Vue图片懒加载
图片懒加载的原理 先将img标签中的src链接设为同一张图片(空白图片),将其真正的图片地址存储再img标签的自定义属性中(比如data-src).当js监听到该图片元素进入可视窗口时,即将自定义属性 ...
- BZOJ1121:[POI2008]激光发射器SZK(乱搞)
Description 多边形相邻边垂直,边长为整数,边平行坐标轴.要在多边形的点上放一些激光发射器和接收器.满足下列要求: 1发射器和接收器不能放置在同一点: 2发射器发出激光可以沿壁反射,最终到达 ...
- 5、JUC--实现 Callable 接口
Callable接口 Java 5.0 在 java.util.concurrent 提供了一个新的创建执行 线程的方式:Callable 接口 Callable 接口类似于 Runnable ...
- JAVA框架 Mybaits
注意:我们在resultType中,对于selectlist方法也是projo类.resultType参数的含义是list的泛型的类型. 一:jar包下载: https://github.com/m ...
- Android 使用第三方登录(QQ和新浪微博)
账号申请什么的我就在这里略过了!(相信大家看看文档都能够处理的)本篇博客仅作引导用--主要提供给哪些不知道怎样入手的朋友.(如果需要更加强大的功能大家可以看一下开放平台上的文档,上面都有的) 使用QQ ...
- rsync+inotifywait
0.rsync+inotify是实现文件实时同步的,加什么参数才能实现实时同步,--delete参数又是什么意思? 1.运行模式(服务器) rsync有两种常用的认证方式,一种是rsync-daemo ...
- PGM1.1-简介
自己根据Jordan大神的资料写的(算翻译?完全不记得了,这是半年前整理的,反正不记得了,如果大神有看到部分重合,那肯定是我借鉴了人家的,本来是一个群里的人大家兴致高说写DL的书(所以这一章并不是书的 ...
- Windows安装mapnik
windows安装mapnik,首先去官网下载windows压缩包:http://mapnik.org/,解压位置C:\mapnik-v2.2.0 然后下载安装python2.7,安装位置 C:\P ...