前言
在网络上的任何活动都可以归结为服务器之前的收发消息。我们可以将这些消息的收发,想象成由鸽子实现的。这很荒谬,但确实如此。
Http
有一天爱丽丝通过鸽子发送一条“我爱你”的消息给鲍勃。但是爱丽丝的情敌马洛里,半路拦截了鸽子,并将消息修改为了“我不爱你”。但是鲍勃无法知道,消息被篡改了。这就是Http的工作方式,非常的不可靠。
一个密码
爱丽丝和鲍勃,准备对消息进行加密。比如将字母偏移3位,比如“A”使用“D”表示,“B”使用“E”表示。马洛里即使拦截了鸽子,也无法进行修改,因为他不清楚加密的方式,无法理解消息的内容。但是鲍勃却可以轻松将消息进行解密。
这被称为symmetric key cryptography(对称密钥加密),你知道如何加密也知道如何解密。现实的生产中,会使用更复杂的加密方式,但是主体思路是相同的。
如何确定密钥
如果爱丽丝和鲍勃在发送消息前不见面,他们无法建立安全的密钥。如果在消息本身之中,携带密钥。马洛里就会知道消息的内容,对其解密后进行篡改。
这就是典型的MITM(中间人攻击),避免中间人攻击我们必须更改加密系统。
一个盒子
爱丽丝和鲍勃设计出了一个更好的加密系统,下面是操作步骤
- 鲍勃向爱丽丝,发送了一只没有任何消息的鸽子
- 爱丽丝在鸽子腿上绑了一个带锁的盒子,盒子是开着的,但是盒子的钥匙爱丽丝留下了。鸽子又飞回到鲍勃哪里。
- 鲍勃写好消息,将消息放进盒子,并锁了起来。然后鸽子将消息带回给爱丽丝。
- 爱丽丝收到鸽子,使用钥匙打开了盒子,并读取了消息
爱丽丝和鲍勃之间的通讯使用了asymmetric key cryptography(非对称密钥加密)。你可以加密消息(把消息放进盒子),但是你没办法解密(你没有钥匙)
盒子也可以称为“公钥”,盒子的钥匙被称为“私钥”。
是否是可靠的盒子?
目前还有一个问题。如果马洛里拦截了鸽子,将盒子换成了自己的盒子,怎么办?
爱丽丝可以在盒子上,添加上自己的签名,鲍勃就会知道这个盒子是否来自爱丽丝。那么鲍勃一开始该如何识别签名呢?
爱丽丝和鲍勃决定让泰德代替爱丽丝在盒子上签名。泰德是一个非常有名的,并且值得信赖的人。泰德只有确定是爱丽丝的盒子的情况下,才会在盒子上签名。而马洛里不会得到泰德的签名。
而泰德就是Certification Authority(证书颁发机构)
盒子比较重
带有盒子的鸽子,飞的比不带盒子的鸽子飞的慢,这该怎么办?
使用非对称加密比使用对称加密要慢。爱丽丝鲍勃决定,只使用盒子(非对称加密)交换加密的密钥。然后使用密钥对消息进行对称加密。
- 鲍勃向爱丽丝发送一只什么都没有的鸽子
- 爱丽丝返回了一个带有盒子的鸽子
- 鲍勃本地生成了一个密钥(用于对称加密),然后把这个密钥放到盒子里,发送给爱丽丝
- 爱丽丝通过私钥对盒子解密,获取了鲍勃生成的密钥
- 之后发送消息,鲍勃只需要使用密钥进行对称加密即可(这样速度就很快了)
这就是Https的原理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。