部署不上gitee
首先把一些概念简单提一下
👇 我们先简单的定义网络层(不是理想模型)
可以看出HTTPS并不是取代HTTP的新应用层,HTTP和HTTPS的区别仅仅是中间多了一层协议,其他网络相关的东西是没有区别的
而SSL (安全套接层) 和TLS (安全传输层协议) 的区别是SSL是旧版而TLS是新版而已 本文都用TLS指代HTTPS的协议层
背景
HTTP的数据传输是明文传输的,这里只要抓包就能被偷私密信息,如账号密码,付款密码等
思考🤔: 学习TCP的时候,不是说TCP就是为了保证数据的可靠性吗?TCP保护的是什么?
加密🔐数据来传输可以解决被偷明文数据的问题,那我们用常规的对称加密不就可以了吗?
加密要考虑的是被破也就是 反解密 的问题,对称加密是可以用原数据和加密后数据来反解出密钥🔑的,当然如果我们可以做到不同客户端的密钥🔑都不相同,那黑客不知道你的原数据就没办法反解出你的密钥了
但是,要做到每个客户端的密钥🔑都不相同就不可避免的要传输密钥🔑,因为服务端也不知道不同客户端的密钥🔑是什么 那就又陷入了传输数据被偷的困境
思考🤔: 现在常用的密码JWT转token的加密形式用在数据传输上是不是也可以?
TLS加密协议
如👆 SSL (安全套接层) 和TLS (安全传输层协议) 的区别是SSL是旧版而TLS是新版而已
HTTPS依然通过 原HTTP 来传输信息 但是信息多通过 TLS 协议进行加密
在 TLS 中使用了两种加密技术,分别为:对称加密和非对称加密。
首次进行 TLS 协议传输需要两个 RTT ,接下来可以通过 Session Resumption 减少到一个 RTT。
HTTPS的非对称加密🔒
非对称加密,使用两个不同的密钥:
公钥(public key)
和私钥(private key)
。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。
RSA算法是非对称加密的核心TODO:
我们用对称加密的反解密思路,黑客通过自己的原数据和加密后数据反解出公钥,黑客拿着公钥去抓包,去解别人用公钥加密的数据,是解不开的😁
优点:加密和解密使用不同的钥匙,传输公钥即可,私钥不需要通过网络进行传输,安全性很高。 缺点:计算量比较大,加密和解密速度相比对称加密慢很多。
结合对称加密提高性能
如👆说的非对称加密的缺点,耗时耗电
那我们结合对称加密和非对称加密不就行了吗,我们用非对称加密来加密我们的对称加密密钥
本文把对称加密的密钥叫做[密钥]
,非对称加密叫[公钥]
和[私钥]
方案1
- 由服务器生成公钥、私钥、密钥
- 服务器用私钥对密钥加密
- 客户端发起请求
- 服务器把加密后的密钥给客户端
- 后续双方用加密后密钥加密数据传输
👆 问题出在用了私钥加密数据,只要用公钥就能解开而公钥是作为公开的东西 只要黑客用公钥解开得出密钥就能任意获取客户端发送的数据了 并且可以用反解对称加密的形式,解开用户的数据,不需要解开加密后密钥
方案2
- 由服务器生成公钥、私钥、密钥
- 服务器用公钥对密钥加密
- 客户端发起请求
- 服务器把加密后的密钥给客户端
- 后续双方用加密后密钥加密数据传输
👆 黑客解不开加密后的密钥,但是黑客拿着加密后的密钥,可以用反解对称加密的形式,解开用户的数据
上诉2种方案的问题都出在,密钥由服务器生成一个唯一的,虽然加密了但是陷入对称加密里一样的问题,所以我们要不同客户端生成不同的密钥,这个步骤交给客户端做 如👇
可以看到这样不可避免的多了一些往返消耗,因为服务器要给客户端公钥,而客户端还要给服务器密钥,才能开始通信
中间人黑客手段
我们现在假设黑客没办法破解出我们和服务器通信的数据了
那作为黑客,我又想出了一个办法
黑客拦截客户端的首次请求,伪装成客户端想要访问的服务器,原本服务器要给客户端返回公钥 黑客伪装成服务器返回一个假的公钥,客户端拿着假的公钥做的操作和通信,都被黑客给自己解开了
HTTPS也要把这种黑客给防掉,而不是让服务器自己解决 这种欺骗客户端的形式,只要让客户端只认自己要请求的服务器就可以了
那服务器怎么证明自己是客户端要访问的对象呢 服务器把一些域名信息给客户端校验就可以了 但是服务器证明自己是自己的信息,也是公开的,那黑客也可以伪装这些信息呀😰
CA机构
证书
完整流程
一个证书多个地方用?自签名?
参考资料
HTTPS是什么?加密原理和证书。SSL/TLS握手过程-技术蛋老师视频HTTPS 详解一:附带最精美详尽的 HTTPS 原理图