SSL/TLS协议的通俗解读

SSL/TLS协议解决的是这样一个问题:在通信过程不安全的前提下,安全的通信

故事是这样的:Alice和Bob是小镇上的一对情侣,他们通过写信交流,小镇上的邮差总是可以偷看信件,Alice和Bob不能见面,也不能要求邮差不去偷看,他们该怎样做才能保证信件内容是安全的?

他们首先想到的是对信的内容加密,Alice加密Bob解密,这样邮差看到了加密内容也没有用。

这是个好办法,但是有一个问题,加解密必须要相同的密钥才行,Alice和Bob该如何约定这个密钥呢?

如果通过信件告知对方密钥,那肯定不安全,密钥会被邮差拿到。如果不沟通密钥能不能实现加解密呢?答案是可以!

  1. Alice先用自己的密钥加密,然后送信给Bob
  2. Bob解不开,没关系,他也用自己的密钥加密,然后送信给Alice
  3. Alice用自己的密钥解密,然后送信给Bob
  4. Bob用自己的密钥解密,拿到了明文

来看看安全性如何:

  1. 双方没有沟通密钥,用的是自己的密钥,是安全的
  2. 内容一直是加密的,邮差即使看到信件也没用,也是安全的

这个问题似乎解决了?然后并没有,邮差发现了他们这个办法之后,他也想了个办法:

  1. Alice先用自己的密钥加密,送信被邮差拦截了
  2. 邮差给密文加密,还给Alice
  3. Alice用自己的密钥解密,送信被邮差拦截了
  4. 邮差用自己的密钥解密,拿到了明文
  5. 邮差用自己的密钥加密,送给Bob
  6. Bob用自己的密钥加密,送信被邮差拦截了
  7. 邮差用自己的密钥解密,送给Bob
  8. Bob用自己的密钥解密,拿到了明文

这个过程中,Alice和Bob做法平时没什么两样,他们感知不到有什么问题,但是信息却泄露了,似乎无解了

历史上这个问题发展到这里停滞了很多很多年,直到非对称加密的出现

所谓的非对称加密,就是有一对密钥A和B,用A密钥加密的信息B密钥可以解密,用B密钥加密的信息A密钥也可以解密

现在重新看这个问题,就变成了Alice在家里弄出了一对密钥A和B,密钥A自己留着,密钥B送给Bob,怎么给Bob?答案是直接给!因为密钥B泄漏了无所谓,Alice不在乎,因为Bob用密钥B加密的信息,世界上再也没有人能解开,只有Alice能解开!

有人会说,邮差也有密钥B能解Alice发的信息,无所谓,因为邮差没有A密钥,他解不开Bob的加密信息,只要有一方密码解不开,信息安全就建立了!

但是邮差还有办法!他可以在分发密钥B的过程中,拦截密钥B,邮差制作密钥对C和D,把D发给Bob,让Bob误以为密钥D是Alice发给他的密钥B,这样Bob用密钥D加密的信息,邮差就可以用密钥C解开了

在这个过程中,Alice和Bob做法和平时没什么两样,他们感知不到有什么问题,但是信息却泄露了,现在的核心问题被转化为如何确定密钥B有没有被篡改?

轮到主角SSL/TLS登场了,他引入了一个第三者CA,CA也有一对密钥E、F,密钥E自己保留,密钥F放在了一个设备里,这个设备免费公开人人可以获取,并且可以识别密钥有没有被篡改,他是怎么做到的呢?

  1. CA要求Alice把他的公钥B在分发之前,先交给CA,CA用他的私钥E加密Alice的公钥B,得到了一个加密数据
  2. CA把加密数据给Alice,Alice把他叫证书
  3. Alice分发密钥B,邮差拦截B,把他的公钥D给了Bob
  4. Alice给Bob发消息,消息携带证书
  5. 邮差有CA的设备,虽然他可以解密证书拿到密钥B,但是他无法伪造证书,因为他没有CA的私钥E,他伪造的证书Bob解不开,证书只能原封不动的给Bob
  6. Bob有CA的设备,用CA设备解密证书,拿到了Alice的密钥B,对比一下邮差给的密钥D,就会发现被篡改了

这里的核心就是CA的设备,可以绕过邮差,成为信息安全的关键

这个设备就是浏览器,CA就是证书颁发机构,CA的公钥在浏览器里,用户通过浏览器请求域名的时候,域名的服务器首先把密钥和证书返回给用户,密钥可能被篡改但证书不可能被篡改,浏览器收到密钥和证书后就可以解密验证密钥的完整性了

真实的场景比这复杂的多,细节很多,但基本原理就这么多,希望能给你带来启发

相关推荐
Marktowin2 小时前
Mybatis-Plus更新操作时的一个坑
java·后端
赵文宇2 小时前
CNCF Dragonfly 毕业啦!基于P2P的镜像和文件分发系统快速入门,在线体验
后端
程序员爱钓鱼2 小时前
Node.js 编程实战:即时聊天应用 —— WebSocket 实现实时通信
前端·后端·node.js
Libby博仙3 小时前
Spring Boot 条件化注解深度解析
java·spring boot·后端
源代码•宸3 小时前
Golang原理剖析(Map 源码梳理)
经验分享·后端·算法·leetcode·golang·map
小周在成长3 小时前
动态SQL与MyBatis动态SQL最佳实践
后端
瓦尔登湖懒羊羊3 小时前
TCP的自我介绍
后端
小周在成长4 小时前
MyBatis 动态SQL学习
后端
子非鱼9214 小时前
SpringBoot快速上手
java·spring boot·后端
我爱娃哈哈4 小时前
SpringBoot + XXL-JOB + Quartz:任务调度双引擎选型与高可用调度平台搭建
java·spring boot·后端