规则说明
今天和老婆还有儿子一起玩了一个传纸条的游戏,规则如下:
-
- 老婆和儿子可以把想说的话,写在纸条上,只能通过我来传递。
-
- 但是纸条的内容不能被我看到。
对话
儿子: 我可以写两张纸条,一张真一张假,这样你就分不清楚啦。
我: 我的确分不清楚哪张是真的,但是妈妈也分不清楚啊,你要怎么告诉妈妈哪张是真的呢?
儿子:。。。。。。
老婆: 我们是不是可以把纸条放进箱子里,然后拿把锁把箱子锁住,然后我和儿子各拿一把一样的钥匙,这样我们有钥匙可以开锁,而你没有钥匙,不就可以传纸条而不被你发现了。
我: 说到点子上了,这样的确可以传纸条而不被发现。但是你要怎么把钥匙交给儿子呢?如果你把钥匙较给我,我可以找佩钥匙的师傅复制一把钥匙啊,这样不就可以读到你们的小纸条了吗?
老婆:。。。。。。
我:我来揭晓谜底吧。
准备阶段:
1. 老婆准备好1把锁和1把钥匙(为了方便起见,记为锁L1,和钥匙 K1)
2. 儿子准备好1把锁和2把钥匙 (记为锁L2,和钥匙 K2)
现在开始传递啦:
1. 老婆先把锁 L1 传递给儿子
2. 儿子把钥匙 K2 放入箱子中,用 老婆给的锁 L1 把箱子锁上,然后传递给老婆
3. 老婆拿到箱子后用钥匙 K1 打开 锁L1, 就拿到了 钥匙 K2
4. 既然老婆和儿子都有钥匙 K2 就可以用 L2 锁住箱子后进行纸条传递了。
原理
我们来分析上面的步骤,上面的步骤其实就做了两件事情:
-
- 前三个步骤主要做的是钥匙的传递
-
- 第四个步骤是信息的传递。
而https协议也就分为 钥匙传递 和 信息传递 这两个步骤。
名称说明
我们先把上面的名词解释换成计算机中的专业术语:
| 现实名词 | 专业术语 | 说明 |
|---|---|---|
| 老婆 | 服务端(server) | |
| 儿子 | 客户端(client) | |
| 锁 L1 | 公钥 | 只能加密使用,和 K1构成了非对称加密 |
| 钥匙 K1 | 私钥 | 只能解密使用,和 L1 构成了非对称加密 |
| 锁L2和钥匙K2 | 对称加密 | 即能加密又能解密 |
钥匙传递
- 当 客户端 向 服务端 发起请求时,服务端 先把 公钥(锁L1) 传递给 客户端。
- 客户端 拿到 公钥 后, 会生产一段 随机数 (钥匙K2),通过 公钥 加密(用L1上锁),然后传回 服务端。
- 服务端 拿到 加密数据后, 使用 私钥 解密(使用钥匙K1打开锁L1),就拿到了那个 随机数,可以用于通信了。
信息传递
- 客户端 就可以使用那个 随机数 来加密了,而 服务端 可以拿 随机数 来解密,然后处理完成后,再把结果以 随机数 加密,然后传回 客户端。
详细流程图
当然上面的段落只是https的原理说明,省略和很多的细节。如果要更全面的了解https,这里推荐李兵老师的一篇文章,
time.geekbang.org/column/arti…
这里就不做细说了,贴一张比较详细的https的流程说明图,供小伙伴参考,感兴趣的小伙伴可自行前往阅读。
意料之外的结局
老婆: 你这个方法太麻烦了,我有一个更加简便的方法。
我: 你说。
老婆: 我先纸条放入箱子,拿把锁锁住,然后传给儿子,然后再把钥匙传给儿子。
我: 这样虽然第一次能成功,但是我可以复制钥匙啊,以后怎么办呢?
老婆: 我每传一次换一把锁啊,反正财政大全掌握在我的手里,论财力你又拼不过我的。
我:。。。。。。土豪,你赢了。