用信鸽来讲解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 协 ...
随机推荐
- length() 用法
length:(字符串 | 列):求出字符串的长度: 求出bqh4表中zym列的长度. select * from bqh4select a.*,length(zym) from bqh4 a
- python基础学习24----使用pymysql连接mysql
使用pymysql连接mysql 安装pymysql pymysql安装可以通过两种方式 使用pip安装 首先简单说一下pip的使用方法 获取帮助 pip --help 升级 pip pip inst ...
- 【转】HTTP学习---Web 缓存
[原文]https://www.toutiao.com/i6592743068623962632/ 1. 前端缓存概述 前端缓存主要是分为HTTP缓存和浏览器缓存.其中HTTP缓存是在HTTP请求传输 ...
- Java读取json文件并对json数据进行读取、添加、删除与修改操作
转载:http://blog.csdn.net/qing_yun/article/details/46865863#t0 1.介绍 开发过程中经常会遇到json数据的处理,而单独对json数据进行 ...
- Flex 布局知识点梳理
传统的布局方案,在针对特殊布局时会很不方便,比如垂直居中,把一个容器等分为N列等等.自从 Flex 出现以后,这些都迎刃而解了,本文对Flex相关内容做一个简单梳理. 什么是 Flex Flex 是 ...
- BZOJ5018:[SNOI2017]英雄联盟(背包DP)
Description 正在上大学的小皮球热爱英雄联盟这款游戏,而且打的很菜,被网友们戏称为「小学生」.现在,小皮球终于受不了网友们的嘲讽,决定变强了,他变强的方法就是:买皮肤! 小皮球只会玩N个英雄 ...
- Shell学习心得(二):传递参数、运算符
1.传递参数 可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 向脚本传递三个参数, ...
- 数据同步canal服务端配置mysql多主
canal服务端HA模式,本人并未使用过,为保证文章的完整性,从以下地址摘抄该部分内容,待以后验证及使用 https://github.com/alibaba/canal/wiki/AdminGuid ...
- Android MD5算法
package com.example.myapi.md5; import java.io.UnsupportedEncodingException; import java.security.Mes ...
- 为什么重写equals还要重写hashcode??
equals和hashcode是object类下一个重要的方法,而object类是所有类的父类,所以所有的类都有这两个方法 equals和hashcode间的关系: 1.如果两个对象相同(即equal ...