知道HTTPS吗? 实现原理是什么?
什么是 HTTPS?
HTTPS并不是一个新的协议, 它在HTTP和TCP的传输中建立了一个安全层,利用对称加密和非对称加密结合数字证书认证的方式,让传输过程的安全性大大提高。
![img](https://weirdo-blog.oss-cn-chengdu.aliyuncs.com/blog/202311021222407.png)
HTTP 协议采用明文传输信息,存在信息窃听、信息篡改和信息劫持的风险
具体来说,HTTP 数据经过 TCP 层,然后经过 WIFI 路由器、运营商和目标服务器,这些环节中都可能被中间人拿到数据并进行篡改,也就是我们常说的中间人攻击。
而协议TLS/SSL
具有身份验证、信息加密和完整性校验的功能,可以避免此类问题发生。安全层的主要职责就是对发起的 HTTP 请求的数据进行加密操作 和 对接收到的 HTTP 的内容进行解密操作。
TLS/SSL
全称安全传输层协议(Transport Layer Security), 是介于TCP
和HTTP
之间的一层安全协议,不影响原有的TCP
协议和HTTP
协议,所以使用HTTPS
基本上不需要对HTTP
页面进行太多的改造。
TLS/SSL
的功能实现主要依赖三类基本算法:散列函数 hash、对称加密、非对称加密。
这三类算法的作用如下:
- 基于散列函数验证信息的完整性
- 对称加密算法采用协商的秘钥对数据加密
- 非对称加密实现身份认证和秘钥协商
散列函数 : 在信息传输过程中,由于传输是明文传输,中间人可以修改信息后重新计算信息的摘要,所以需要对传输的信息和信息摘要进行加密。
对称加密 : 对称加密的优势就是信息传输使用一对一,需要共享相同的密码,密码的安全是保证信息安全的基础,服务器和 N 个客户端通信,需要维持 N 个密码记录且不能修改密码。
非对称加密 : 非对称加密的特点就是信息一对多,服务器只需要维持一个私钥就可以和多个客户端进行通信,但服务器发出的信息能够被所有的客户端解密,且该算法的计算复杂,加密的速度慢。
HTTPS 是如何保证安全的?
对称加密:
- 即通信的双方都使用同⼀个秘钥进行加解密,对称加密虽然很简单性能也好
- 但是无法解决首次把秘钥发给对方的问题,很容易被黑客拦截秘钥。
非对称加密:
- 私钥 + 公钥 = 密钥对
- 即用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密
- 因为通信双方的收集都有⼀套自己的密钥对,通信之前双方会先把自己的公钥都先发给对方
- 然后对方再拿着这个公钥来加密数据响应给对方,等到到了对方那里,对方再用自己的私钥进行解密
非对称加密使用了一对密钥,公钥与私钥,所以安全性高,但加密与解密速度慢,影响性能。
有没有什么更好的方案呢?
解决方案:两者结合
结合两种加密方式, 解决的办法是将对称加密的密钥使用非对称加密的公钥进行加密,然后发送出去,接收方使用私钥进行解密得到对称加密的密钥,然后双方可以使用对称加密来进行沟通。
尽管通过两者加密方式的结合,能够很好地实现加密传输,但实际上还是存在一些问题
现在的方法也不一定是安全的,因为没有办法确定得到的公钥就一定是安全的公钥。可能存在一个中间人,截取了对方发给我们的公钥,然后将他自己的公钥发送给我们,当我们使用他的公钥加密后发送的信息,就可以被他用自己的私钥解密。然后他伪装成我们以同样的方法向对方发送信息,这样我们的信息就被窃取了,然而自己还不知道。
事实上 HTTPS 在上述结合对称和非对称加密的基础上,又添加了数字证书认证的步骤。
其目的就是让服务器证明自己的身份, 防止被中间人攻击。
数字证书是什么?
首先使用一种 Hash 算法来对公钥和其他信息进行加密,生成一个信息摘要,然后让有公信力的认证中心(简称 CA )用它的私钥对消息摘要加密,形成签名。最后将原始的信息和签名合在一起,称为数字证书。当接收方收到数字证书的时候,先根据原始信息使用同样的 Hash 算法生成一个摘要,然后使用 CA 的公钥来对数字证书中的签名进行解密,最后将解密获得的摘要和生成的摘要进行对比,就能发现得到的信息是否被更改了。
这个方法最要的是认证中心的可靠性,一般浏览器里会内置一些顶层的认证中心的证书,相当于我们自动信任了他们,只有这样才能保证数据的安全。
下面为具体流程
CA (有公信力的认证中心) 签发证书的过程:
- 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行
Hash
计算,得到一个Hash
值; - 然后
CA
会使用自己的私钥将该Hash
值加密,生成Certificate Signature
,也就是CA
对证书做了签名; - 最后将
Certificate Signature
添加在文件证书上,形成数字证书;
客户端校验服务端的数字证书的过程:
- 首先客户端会使用同样的
Hash
算法获取该证书的Hash
值H1
; - 浏览器收到证书后可以使用
CA
的公钥解密 Certificate Signature 内容,得到一个Hash
值H2
; - 最后比较
H1
和H2
,如果值相同,则为可信赖的证书,否则则认为证书不可信。