我相信大家面试的时候对于 HTTPS 这个问题一定不会陌生,可能你只能简单的说一下与 HTTP 的区别,但是真正的原理是否很清楚呢?他到底如何安全?这一篇让我们用大白话来揭开 HTTPS 的神秘面纱吧!
HTTPS 是什么
HTTPS 是什么?答:HTTPS 不就是 HTTP 后面多加了一个 S 吗?
对这里的 S 就是指 SSL/TLS(就是一种安全加密协议,想深入了解的同学可以自行百度),HTTPS 是在 HTTP 的基础上,利用 SSL/TLS 加密数据包。
我们记住两个主要目的就行:
HTTPS 怎么对数据进行加密
我们已经知道 HTTPS 第一个目的是给数据加密,对于数据加密,我们这里要谈到两种加密方式:
混合加密:知道了两种加密方式的优缺点之后,我们的 HTTPS 就很厉害了,它采用两者混合的加密方式。
不是说对称加密的密钥不安全吗?那我们换一种思路,我们在传递过程把我们的对称加密中的密钥用非对称加密的方式去传递就好了。
这句话有点绕,我们看上图:
就算传输过程被攻击者截取到了被加密的会话秘钥 他没有服务器的私钥是无法得到会话秘钥的。
整个过程巧妙之处就在于之前我们传递的是钥匙,现在我们传递的是保险箱,钥匙在保险箱里面,你就算拿到了保险箱,没有保险箱的钥匙也拿不到钥匙。
HTTPS 怎么验证网站服务器身份
HTTPS 第二个目的是对网站服务器进行真实身份认证,那么这一点又是怎么做到的呢?
先来看一个问题,上一步我们已经解决了数据加密的问题,虽然攻击者无法解密数据,但是他可以篡改数据,我们怎么知道数据没被动过呢?
数据被篡改怎么办
这个时候就要使用数字签名了,数字签名:将原文(部分数据关键信息)先用 Hash 函数生成消息摘要,然后用发送者的私钥加密生成数字签名,与原文一起传送给接收者。
两个关键点:
客户端如何校验数字签名呢?(利用服务器私钥加密,公钥解密)客户端收到服务器发过来的数字签名之后:
如果两个信息摘要一致,说明数据没有被篡改。OK,到这里可能你觉得没问题了!
其实最后还有一个很关键的点是:我们刚刚所有的假设都基于客户端的公钥是服务器传递过来的,那如果攻击者伪造了服务器的公钥怎么办呢?
服务器公钥被篡改怎么办
这个时候就要使用数字证书了,数字证书认证机构(CA)处于客户端与服务器双方都可信赖的第三方机构的立场上。
服务端向 CA 申请数字证书,审核通过后 CA 会向申请者签发认证文件-证书,包含以下内容:
拿到数字证书后,服务器传递数字证书给客户端。
客户端怎么校验数字证书
步骤如下:
作者:Big shark@LX 出处:https://juejin.im/post/5eb3c6065188255fd54de543
end