HTTP协议学习---(四)安全篇

一 HTTPS与SSL/TSL

1 因为 HTTP 是明文传输,所以不安全,容易被黑客窃听或篡改;

2 通信安全必须同时具备机密性、完整性、身份认证和不可否认这四个特性;
机密性由对称加密AES保证,完整性由SHA384摘要算法保证,身份认证和不可否认由RSA非对称加密保证

3 HTTPS 的语法、语义仍然是 HTTP,但把下层的协议由 TCP/IP 换成了 SSL/TLS;

4 SSL/TLS
是信息安全领域中的权威标准,SSL由网景公司发明,在V3之后被互联网工 程组命名为TSL,最新的是2018年的V1.3,采用多种先进的加密技术保证通信安全;

5 OpenSSL 是著名的开源密码学工具包,是 SSL/TLS 的具体实现。

6 补充:
TLS 的密码套件命名非常规范,格式很固定。基本的形式是“**交换算法 + 签名算法 + 对称加密算法 + 摘要算法”
例:
图中表示的是“握手时使用 ECDHE 算法进行**交换,用 RSA 签名和身份认证,握手后的通信使用 AES 对称算法,**长度 256 位,分组模式是 GCM,摘要算法 SHA384 用于消息认证和产生随机数。”
在这里插入图片描述

一 TSL 加密方式

1 对称解密
有一个**,通过这个**可以解密解密数据,目前常用的对称加密算法有RC4、DES、3DES、AES、ChaCha20。其中RC4、DES、3DES被认为不安全的,现在基本不再使用。
AES 的意思是“高级加密标准”(Advanced Encryption Standard),**长度可以是 128、192 或 256。它是 DES 算法的替代者,安全强度很高,性能也很好,而且有的硬件还会做特殊优化,所以非常流行,是应用最广泛的对称加密算法。(分组加密的概念理解:拿ECB来举例子,假设使用aes128,**长度是16字节,那么就把明文按16字节分组,然后每个分组用**加密)。
ChaCha20 是 Google 设计的另一种加密算法,**长度固定为 256 位,纯软件运行性能要超过 AES,曾经在移动客户端上比较流行,但 ARMv8 之后也加入了 AES 硬件优化,所以现在不再具有明显的优势,但仍然算得上是一个不错的算法。

2 非对称加密
对称加密最大的问题是加密解密都需要一个**来操作,当**被泄露,那么任何人都可以加密解密其中数据导致不安全。因此出现了非对称加密,也就是公私钥对。一般私钥自己保存,公钥可以发给任何人。公钥和私钥有个特别的“单向”性,虽然都可以用来加密解密,但公钥加密后只能用私钥解密,反过来,私钥加密后也只能用公钥解密(私钥加密也可以用公钥解密的意义在于不能抵赖,因为私钥加密只能由持有人发起,所以外部收到的信息如果可以被解密则一定是由持有人发起的)。常用的有DH、DSA、RSA、ECC 等。
RSA 可能是其中最著名的一个,几乎可以说是非对称加密的代名词,它的安全性基于“整数分解”的数学难题,使用两个超大素数的乘积作为生成**的材料,想要从公钥推算出私钥是非常困难的。
ECC(Elliptic Curve Cryptography)是非对称加密里的“后起之秀”,它基于“椭圆曲线离散对数”的数学难题,使用特定的曲线方程和基点生成公钥和私钥,子算法 ECDHE 用于**交换,ECDSA 用于数字签名。
比起 RSA,ECC 在安全强度和性能上都有明显的优势。160 位的 ECC 相当于 1024 位的 RSA,而 224 位的 ECC 则相当于 2048 位的 RSA。因为**短,所以相应的计算量、消耗的内存和带宽也就少,加密解密的性能就上去了

3 非对称加密与对称加密的选择
非对称加密效率安全性高但是效率比较低,对称加密效率高但是安全性比较低。TSL采用混合加密的方式。
先把公钥给到客户端,然后客户端用公钥加密随机生成的**作为之后会话**,服务端用私钥解密之后拿到会话**,之后通话全都用会话**做对称加密。

4 信息完整性,摘要算法
即使使用了对称加密与非对称加密,这样只能保证首发双方以及传输过程中的密文安全,但是无法保证中间被多次修改后根据服务器的反应多次修改最终反推出**,因此还要保证信息的完整性。
一般常用的有MD5,SHA-1.但是由于其比较简单不安全,因此TSL禁用这两种的算法,而采取了SHA-2。
SHA-2 实际上是一系列摘要算法的统称,总共有 6 种,常用的有 SHA224、SHA256、SHA384,分别能够生成 28 字节、32 字节、48 字节的摘要。

5 摘要算法与非对称加密结合
由于直接对原始的明文进行摘要算法效率低,且容易通过摘要反推出原文,因此可以对上面对称加密的**进行摘要形成数字签名,然后用私钥加密摘要,再用公钥解密摘要。

6 CA与数字证书
最终要保证双方是互相信任的就需要有颁发的数字证书,颁发机构就是CA,为了保证颁发机构是值得信任的就要找颁发机构的上一级颁发机构,最终有一个权威颁发机构,也称为自签名证书或者根证书。双方顺着证书链可以找到根证书即表明可信。
作为信任链的源头 CA 有时也会不可信,解决办法有 CRL(证书吊销列表)、OCSP(在线证书状态协议),还有终止信任。

7 总结:
①服务器去CA机构申请证书,证书中包含了要发给客户端的公钥、签发者、到期时间等等信息。如果这样简单地把证书发给浏览器,中间人可以轻松地修改成自己的公钥,之后的通信就是不安全的了。于是需要一定的加密手段,这里的做法就是使用数字签名:将证书的信息利用摘要算法计算出摘要之后,用CA的秘钥进行加密,生成数字签名。
②服务器将数字证书和数字签名一起发给浏览器,因为有数字签名,所以数字证书无法被中间人做修改(修改后的摘要变动了,与签名里解密出的原始摘要不匹配,所以能够发现原文被窜改),浏览器拿到数字证书之后,去本地的信任机构中查询到对应的机构,利用其公钥解密数字签名,验证证书是否有被修改过。这一步就保证了浏览器获取到的公钥一定是正确的。
③公钥正确地传给浏览器之后,接着就是协商对称加密的**,然后通信等等…

二 TSL握手过程

1 TSL 1.2握手过程
在这里插入图片描述
在这里插入图片描述

①在 TCP 建立连接之后,浏览器会首先发一个“Client Hello”消息,也就是跟服务器“打招呼”。里面有客户端的版本号、支持的密码套件,还有一个随机数(Client Random),用于后续生成会话**。
②服务器收到“Client Hello”后,会返回一个“Server Hello”消息。把版本号对一下,也给出一个随机数(Server Random),然后从客户端的列表里选一个作为本次通信使用的密码套件
③服务器为了证明自己的身份,就把证书也发给了客户端(Server Certificate)
④因为服务器选择了 ECDHE 算法,所以它会在证书后发送“Server Key Exchange”消息,里面是椭圆曲线的公钥(Server Params),用来实现**交换算法,再加上自己的私钥签名认证。
⑤“Server Hello Done”消息,服务器说:“我的信息就是这些,打招呼完毕。”
这样第一个消息往返就结束了(两个 TCP 包),结果是客户端和服务器通过明文共享了三个信息:Client Random、Server Random 和 Server Params。
⑥此时客户端开始走证书链逐级验证,确认证书的真实性,再用证书公钥验证签名,就确认了服务器的身份:“刚才跟我打招呼的不是骗子,可以接着往下走。”
⑦,客户端按照密码套件的要求,也生成一个椭圆曲线的公钥(Client Params),用“Client Key Exchange”消息发给服务器。
⑧现在客户端和服务器手里都拿到了**交换算法的两个参数(Client Params、Server Params),就用 ECDHE 算法一阵算,算出了一个新的东西,叫“Pre-Master”,其实也是一个随机数。现在客户端和服务器手里有了三个随机数:Client Random、Server Random 和 Pre-Master。用这三个作为原始材料,就可以生成用于加密会话的主**,叫“Master Secret”。而黑客因为拿不到“Pre-Master”,所以也就得不到主**。主**有 48 字节,但它也不是最终用于通信的会话**,还会再用 PRF 扩展出更多的**,比如客户端发送用的会话**(client_write_key)、服务器发送用的会话**(server_write_key)等等
⑨有了主**和派生的会话**,握手就快结束了。客户端发一个“Change Cipher Spec”,然后再发一个“Finished”消息,把之前所有发送的数据做个摘要,再加密一下,让服务器做个验证。
⑩服务器也是同样的操作,发“Change Cipher Spec”和“Finished”消息,双方都验证加密解密 OK,握手正式结束,后面就收发被加密的 HTTP 请求和响应了。

2 TSL1.3握手过程
在这里插入图片描述
在这里插入图片描述

扩展协议:记录头的 Version 字段被兼容性“固定”的情况下,只要是 TLS1.3 协议,握手的“Hello”消息后面就必须有“supported_versions”扩展,它标记了 TLS 的版本号,使用它就能区分新旧协议。
TLS1.3 还有一个安全强化措施,多了个“Certificate Verify”消息,用服务器的私钥把前面的曲线、套件、参数等握手数据加了签名,作用和“Finished”消息差不多。但由于是私钥签名,所以强化了身份认证和和防窜改。

3 总结
为了兼容 1.1、1.2 等“老”协议,TLS1.3 会“伪装”成 TLS1.2,新特性在“扩展”里实现;
1.1、1.2 在实践中发现了很多安全隐患,所以 TLS1.3 大幅度删减了加密算法,只保留了 ECDHE、AES、ChaCha20、SHA-2 等极少数算法,强化了安全;
TLS1.3 也简化了握手过程,完全握手只需要一个消息往返,提升了性能。

三 HTTPS优化

1 可以有多种硬件和软件手段减少网络耗时和计算耗时,让 HTTPS 变得和 HTTP 一样快,最可行的是软件优化;
2 应当尽量使用 ECDHE 椭圆曲线密码套件,节约带宽和计算量,还能实现“False Start”;
3 服务器端应当开启“OCSP Stapling”功能,避免客户端访问 CA 去验证证书;
4 会话复用的效果类似 Cache,前提是客户端必须之前成功建立连接,后面就可以用“Session ID”“Session Ticket”等凭据跳过**交换、证书验证等步骤,直接开始加密通信。

四 简答HTTPS为什么比HTTP要安全

推荐查看:https://mp.weixin.qq.com/s/zbVMWmzl4NTsV_kd3ewAUw