【Linux网络与网络编程】07.应用层协议HTTPS
HTTP 协议内容都是按照文本的方式明文传输的,这就导致在传输过程中出现一些被篡改的情况。HTTPS 就是在 HTTP 协议的基础上引入了一个加密层的应用层协议。
1. 基础概念
1.1 加密与解密
加密就是把明文(要传输的信息)进行一系列变换,生成密文。解密就是把密文再进行一系列变换,还原成明文。在这个加密和解密的过程中,往往需要一个或者多个中间的数据辅助进行这个过程,这样的数据称为密钥。
为什么要加密?
因为 http 的内容是明文传输的,明文数据会经过路由器、wifi 热点、通信服务运营商、代理服务器等多个物理节点。如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双方察觉,这就是中间人攻击 ,所以我们才需要对信息进行加密。
所以加密就是为了避免中间人攻击。
1.2 常见的加密方式
1.2.1 对称加密
采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密。
• 特征:
加密和解密所用的密钥是相同的。通过同一个 "密钥" 把明文加密成密文,并且也能把密文解密成明文
• 常见对称加密算法:
DES、3DES、AES、TDEA、Blowfish、RC2 ……
• 特点:
算法公开、计算量小、加密速度快、加密效率高
1.2.2 非对称加密
需要两个密钥来进行加密和解密,这两个密钥是公钥私钥。
• 特征:
通过公钥对明文加密,变成密文;通过私钥对密文解密,变成明文。也可以反着用,通过私钥对明文加密,变成密文;通过公钥对密文解密,变成明文
• 常见非对称加密算法:
RSA,DSA,ECDSA ……
• 特点:
算法强度复杂、安全性依赖于算法与密钥,但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。 最大的缺点就是运算速度非常慢,比对称加密要慢很多。
1.2.3 数据摘要(数字指纹)
数字指纹(数据摘要),其基本原理是利用单向散列函数(Hash 函数)对信息进行运算,生成一串固定长度的数字摘要。数字指纹并不是一种加密机制,但可以用来判断数据有没有被篡改。
• 常见摘要算法:
MD5、SHA1、SHA256、SHA512 …… 算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)
• 特征:
摘要严格意义不是加密,通常用来进行数据对比
2. HTTPS的工作过程探索
2.1 方案一:只使用对称加密
若只使用对称加密的话,服务端如何得知客户端的密钥呢?往往是在建立连接时将密钥传过去,那么如何保证密钥的安全性呢?在给密钥加密吗?这不就变成了鸡生蛋,蛋生鸡的问题了吗?因此该方案不具备可行性!
2.2 方案二:只使用非对称加密
只使用非对称加密我们可以看到貌似是要比对称加密要好的,不过在初始建立联系时,公钥还是面临着被中间人获取的安全问题。当客户端向服务端发消息时,需要服务端使用私钥进行解密的,而私钥是没法被获取的,所以可以认为是安全的。但是服务端向客户端发送消息时,需要客户端通过公钥进行解密,而公钥是可以被获取的,所以这一部分是不安全的。可以认为是单向安全的。
2.3 方案三:双方都使用非对称加密
这次总可以了吧,但是效率太慢了(非对称加密的速度很慢,开始时提到过)。而且这种方案也存在着安全问题(讲完方案四具体来说)。
2.4 方案四:非对称加密 + 对称加密
这一部分我们只使用非对称密钥用于初始时交换公钥,所以效率是提高了的,但是这一部分就没有问题了吗?
中间人攻击:
上面这种情况就是中间人就可以拿到对称密钥X了,中间人就可以自由的解密监听信息,并篡改相应信息了。
此时面对中间人攻击的核心问题就是:客户端无法甄别自己收到的公钥是一个由客户端发出的合法的公钥,所以接下来我们看看这个问题是如何解决的。
数据签名
签名的形成是基于非对称加密算法的。它的作用就是对数据摘要(数字指纹)进行加密。
可以看出只有持有私钥的签名者菜呢个对数据进行签名,那么谁是签名者呢?
CA机构与证书
服务端在使用 HTTPS 前,需要向 CA 机构申领一份数字证书,数字证书里含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书里获取公钥就行了,证书就如身份证,证明服务端公钥的权威性。
接下来看一下证书的格式:
我们可以看出,证书实质上就是携带签名的明文数据。
CA机构签发证书的流程:
可以知道,当客户端收到证书之后需要对证书中的公钥提取,即解密证书。故而所有的浏览器都要内置一些可行的CA机构或者它授权的子机构的公钥!
2.5 方案五:非对称加密 + 对称加密 + 证书认证
使用这种方案就可以避免中间人的攻击了,因为中间人哪怕拿到了证书也无法对证书进行篡改。而这种方案也就是当前的HTTPS使用的工作方案。
总结:
HTTPS 工作过程中涉及到的密钥有三组。
第一组(非对称加密):用于校验证书是否被篡改。服务器持有私钥(私钥在形成 CSR 文件与申请证书时获得),客户端持有公钥(操作系统包含了可信任的 CA 认证机构有哪些, 同时持有对应的公钥),服务器在客户端请求时,返回携带签名的证书,客户端通过这个公钥进行证书验证,保证证书的合法性,进一步保证证书中携带的服务端公钥权威性。
第二组(非对称加密):用于协商生成对称加密的密钥。客户端用收到的 CA 证书中的公钥(是可被信任的)给随机生成的对称加密的密钥加密传输给服务器,服务器通过私钥解密获取到对称加密密钥。
第三组(对称加密):客户端和服务器后续传输的数据都通过这个对称密钥加密解密。
其实一切的关键都是围绕这个对称加密的密钥,其他的机制都是辅助这个密钥工作的。第二组非对称加密的密钥是为了让客户端把这个对称密钥传给服务器,第一组非对称加密的密钥是为了让客户端拿到第二组非对称加密的公钥。