简述一下HTTPS
闪客和小宇要通过传字条的方式交流,怎样保证纸条传递到位,信息不被篡改,偷看?
1. 单钥匙锁 - 对称加解锁
给盒子配一个锁和钥匙,解锁需要钥匙,上锁也需要钥匙。
由于中间的同学没有钥匙,就无法偷窥里面的内容了,也无法篡改里面的内容。
但是好景不长,由于钥匙也是通过同学传递过去的,同学偷偷复制了一把钥匙,然后拿着钥匙,偷看内容,修改内容,放回盒子,再把盒子锁起来。
2. 双钥匙锁 - 非对称加解锁 - 防篡改
给盒子配一个锁和两把不同的钥匙 A 和 B,用钥匙 A 加锁,必须用钥匙 B 才能解锁。反过来用钥匙 B 加锁,必须用钥匙 A 才能解锁。
我每次传字条的时候,先用钥匙A加密,然后到了小宇那里,他用钥匙B解密,就可以看到内容了。
坏人只能用钥匙 B 打开盒子偷看我的内容,但是他如果想篡改内容,必须用钥匙 A 才能把盒子锁住,而钥匙 A 一直在我手里,从来没有传递过,没人知道。
当然,坏人也可以用钥匙 B 把盒子锁住,但用 B 锁住的盒子,只能用 A 去解锁,所以如果小宇用自己手里的 B 解锁时,发现解不开,就知道内容被人篡改了。
内容篡改的问题解决了,但是内容被偷看的问题还没解决!
3. 单双钥匙锁相互配合
我们可以用双钥匙锁的安全性(防篡改),把单钥匙锁的钥匙安全地传送给对方,然后之后再用单钥匙锁,高效率地通信。
- 由小宇设计一个双钥匙锁,配两把钥匙 C 和 D,然后把钥匙 D 给我。
- 我这边准备一个单钥匙锁,配一个钥匙 M,把它放在盒子里,用小宇给我的钥匙 D 加锁,传给小宇。
- 传送过程中,由于钥匙 D 加锁的盒子只能用钥匙 C 解锁,所以中间人无法查看和篡改内容,最终钥匙 M 被安全传送到小宇那边。
- 此时,我们双方都有了钥匙 M 和与之对应的单钥匙锁,而且这个钥匙 M 谁都不知道。
- 在此之后,我们用钥匙 M 去加密我们的信息,对方用钥匙 M 解密我们的信息,达成了安全通信的条件。
但是好景不长,中间人还是找到了破解方法
- 由小宇设计一个双钥匙锁,配两把钥匙 C 和 D,然后把钥匙 D 给我。
- 中间人没把钥匙 D 给我,而是把自己造的钥匙 Y 给了我,但我以为这是小宇给我的呢。
- 我这边准备一个单钥匙锁,配一个钥匙 M,把它放在盒子里,用小宇给我的钥匙(其实是坏蛋给我的钥匙 Y)加锁,传给小宇。
- 中间人收到加锁后的盒子,用自己的钥匙 X 轻松解了锁,因为这个锁是被 Y 锁的嘛~解锁后取出里面的钥匙 M,复制了一份,然后再用小宇的钥匙 D 加锁。
- 小宇用 C 解开了锁,得到里面的钥匙 M,这个的确是我给的,但小宇不知道此时已经被坏人知道了,与此同时我也不知道这个事。
- 于是我们用钥匙 M 加锁解锁通信,坏蛋也同样用钥匙 M 来偷窥或篡改我们的信息。
4. 班长公证
无论如何,我们第一次传输的那把钥匙,是无法进行加密的,会被中间人看到的,这是无法避免的。当时我们能不能做到,让对方可以看到,但是却无法篡改?
于是有了班长。
班长准备了一个双钥匙锁,然后配置了两把钥匙 J 和 K,然后把钥匙 K 公开让所所有人都知道。
小宇在第一次准备给我钥匙 D 时,不再直接给我了,而是找班长,把钥匙 D 放在一个盒子里,让班长用自己的钥匙 J 给加锁。
然后小宇把这个用钥匙 J 加好锁的盒子传给我,我用班长公开的钥匙 K 解锁盒子,就可以得到小宇的钥匙 D 了。
中间人可以用公开的钥匙 K 把盒子打开,看到小宇给我准备的钥匙 D。
但是他们却无法伪造钥匙 Y 传给我,因为要加锁这个盒子,必须要有钥匙 J,而钥匙 J 只有班长知道。中间人只能看到,不能修改了。
如果不能修改,我就能成功用小宇给我的真正的钥匙 D 加锁我们之后要通讯用的钥匙 M,于是这个钥匙 M 就被安全地传给了小宇,我们之后就可以用这个谁也不知道的钥匙 M,和配套的单钥匙锁,愉快地聊天了!
有钥匙的盒子只能由班长上锁,中间人无法篡改有钥匙的盒子。
5. 总结
5.1 对称加密
单钥匙就是对称加密。对称加密的速度很快,可以用于传输过程中的数据加密,防止中间人查看和篡改信息。但是如何将对称加密的秘钥安全传递过去是个问题。
5.2 非对称加密
双钥匙就是非对称加密,用于防止内容被篡改。
5.3 加密
公钥加密,私钥解密,这个叫加密
5.4 签名
私钥加密,公钥解密,这个叫签名。
刚刚的过程中,首先小宇让班长用私钥 J 加密自己的公钥 D,传给我,这是私钥加密公钥解密,这个目的就是签名,防止公钥 D 在传输过程中被别人篡改。
5.5 HTTPS解决了什么问题?
由于 HTTP 天生明文传输的特性,在 HTTP 的传输过程中,任何人都有可能从中截获、修改或者伪造请求发送,所以可以认为 HTTP 是不安全的。
5.6 简述一下HTTPS
对称加密和非对称加密搭配使用,使用CA机构对非对称加密钥匙签名,用非对称机密传输对称加密的钥匙。成功后,用对称加密钥匙传输数据。
- 服务器通过CA机构传递双钥匙 D,保证钥匙 D 在传输过程中无法被篡改。
CA机构先对钥匙D做签名(用私钥加密),发送给客户端,中间人虽然可以解密,看到钥匙 D,但是没办法上锁(因为私钥只在CA机构上有) - 客户端拿到双钥匙 D,用CA机构的公钥解密
- 客户端拿双钥匙 D,给单钥匙 M 加密,传给服务器
- 服务器用双钥匙 D 解密,拿到单钥匙 M
- 然后服务器和客户端就可以用单钥匙来进行交流