用信鸽来讲解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 协 ...
随机推荐
- Java入门系列:实例讲解ArrayList用法
本文通过实例讲解Java中如何使用ArrayList类. Java.util.ArrayList类是一个动态数组类型,也就是说,ArrayList对象既有数组的特征,也有链表的特征.可以随时从链表中添 ...
- Vue.js Is Good, but Is It Better Than Angular or React?
Vue.js is a JavaScript library for building web interfaces. Combining with some other tools It also ...
- python基础之单例设计模式
class Player(): instance = None init_flag = False def __init__(self): if self.init_flag is False: pr ...
- openlayers5实战--踩坑总结
1.接口返回圆心坐标和半径,直接通过new Circle(center,radius)添加圆形feature变小问题. 解决办法: new Feature()的geometry参数不能直接赋值new ...
- XSS详解
什么是XSS(跨站脚本攻击) XSS又叫CSS (Cross Site Script) ,跨站脚本攻击.它指的是恶意攻击者往Web页面里插入恶意html代码或者javascript代码,当用户浏览该页 ...
- 协程运行原理猜测: async/await
1.根据await调用链寻找最终的生产者或服务提供者: 2.请求服务: 3.进行执行环境切换,跳出顶层函数(第一个无await修饰的函数),执行后面的语句: 4.服务完成,将服务数据复制给最底层的aw ...
- Android友盟推送
当前版本号:v3.0.5 1.下载SDK解压并导入(import module,compile project(':PushSDK')),里面有demo,用demo的包名去官网添加一个应用,然后替换d ...
- php isset+{} 判断字符串长度比strlen效率高
PHP 变量后面加上一个大括号{},里面填上数字,就是指 PHP 变量相应序号的字符.例如:$str = 'hello';echo $str{0}; // 输出为 hecho $str{1}; // ...
- 利用Python爬取豆瓣电影
目标:使用Python爬取豆瓣电影并保存MongoDB数据库中 我们先来看一下通过浏览器的方式来筛选某些特定的电影: 我们把URL来复制出来分析分析: https://movie.douban.com ...
- 代码段:js表单提交检测
市面上当然有很多成型的框架,比如jquery的validation插件各种吧.现在工作地,由于前端童鞋也没用这些个插件.根据业务的要求,自己就在代码里写了个简单的表单提交的检测代码(php的也写了一个 ...