目录
[1.HTTPS 是什么](#1.HTTPS 是什么)
[1. 什么是"加密"](#1. 什么是"加密")
[2. 为什么要加密](#2. 为什么要加密)
[4. 数据摘要 && 数据指纹 (两个是一个概念)](#4. 数据摘要 && 数据指纹 (两个是一个概念))
[5. 数字签名](#5. 数字签名)
[2.HTTPS 的工作过程探究](#2.HTTPS 的工作过程探究)
[方案1: 只使用对称加密](#方案1: 只使用对称加密)
1.HTTPS 是什么
- HTTPS 也是⼀个应⽤层协议。是在 HTTP 协议的基础上引⼊了⼀个加密层。
- HTTP 协议内容都是按照⽂本的⽅式明文传输的。这就导致在传输过程中出现⼀些被篡改的情况。

1. 什么是"加密"
加密 就是把明⽂ (要传输的信息)进⾏⼀系列变换,⽣成密⽂。
解密 就是把密⽂ 再进⾏⼀系列变换,还原成明⽂。
在这个加密和解密的过程中,往往需要⼀个或者多个中间的数据,辅助进行这个过程,这样的数据称为密钥(正确发⾳ yue 四声,不过⼤家平时都读作 yao 四声)。
2. 为什么要加密
由于我们通过网络传输的任何的数据包都会经过运营商的网络设备(路由器,交换机等),那么运营商的网络设备就可以解析出你传输的数据内容,并进行篡改。
点击 "下载按钮" 其实就是在给服务器发送了⼀个 HTTP 请求,获取到的 HTTP 响应其实就包含了该 APP 的下载链接。运营商劫持之后,就发现这个请求,⾃动的把交给用户的响应给篡改成其他的下载地址了。

所以:因为http的内容是明文传输的,明文数据会经过路由器、wifi热点、通信服务运营商、代理服务器等多个物理节点 ,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双⽅察觉,这就是**中间人攻击 ,**所以我们才需要对信息进⾏加密。
不⽌运营商可以劫持,其他的黑客也可以⽤类似的⼿段进⾏劫持,来窃取⽤⼾隐私信息,或者篡改内容。在互联⽹上,明⽂传输是⽐较危险的事情!!!HTTPS 就是在 HTTP 的基础上进行了加密,进⼀步的来保证用户的信息安全~
3.常见的加密方式
对称加密:
- 采⽤单钥密码系统的加密⽅法,同⼀个密钥可以同时⽤作信息的加密和解密,这种加密⽅法称为对称加密,也称为单密钥加密,特征:加密和解密所⽤的密钥是相同的
- 常⻅对称加密算法(了解):DES、3DES、AES、TDEA、Blowfish、RC2等
- 特点:算法公开、计算量小、加密速度快、加密效率⾼
对称加密其实就是通过同⼀个 "密钥",把明文加密成密⽂,并且也能把密文解密成明文。⼀个简单的对称加密,按位异或。
非对称加密:
- 需要两个密钥来进⾏加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
- 常⻅⾮对称加密算法(了解):RSA,DSA,ECDSA
- 特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,⽽使得加密解密速度没有对称加密解密的速度快。
⾮对称加密要⽤到两个密钥,⼀个叫做 "公钥",⼀个叫做 "私钥"。公钥和私钥是配对的,谁是公钥私钥原则上随便选一个,最大的缺点就是运算速度非常慢,⽐对称加密要慢很多。
- 通过公钥对明⽂加密,变成密文
- 通过私钥对密文解密,变成明文
也可以反着⽤
- 通过私钥对明文加密,变成密文
- 通过公钥对密文解密,变成明文
4. 数据摘要 && 数据指纹 (两个是一个概念)
- 数字指纹(数据摘要),其基本原理是利⽤单向散列函数(Hash函数)对信息进行运算,⽣成⼀串固定⻓度的数字摘要。数字指纹并不是⼀种加密机制,但可以用来判断数据有没有被窜改。
- 摘要常⻅算法:有MD5、SHA1、SHA256、SHA512等,算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率⾮常低)
- 摘要特征:和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推原信息,通常用来进行数据前后对比 。
第一个场景:服务器端数据库中存放用户信息时,用户名直接存储,而密码存放MD5()之后的内容,防止服务器数据库泄露造成更大的影响。对比是否被篡改
第二个场景:百度网盘秒传上传,现在本地通过 Hash 算法形成数据指纹,查看服务器数据指纹中是否存在,相同就不用传了,没找到再慢慢传。对比两个文件相同
5. 数字签名
- 数据摘要&&指纹经过加密,就得到数字签名(后⾯细说)
2.HTTPS 的工作过程探究
方案1: 只使用对称加密
如果通信双⽅都各⾃持有同⼀个密钥X,且没有别⼈知道,这两⽅的通信安全当然是可以被保证的(除⾮密钥被破解)。引入对称加密之后,即使数据被截获,由于⿊客不知道密钥是啥,因此就⽆法进行解密,也就不知道请求的真实内容是啥了。
但事情没这么简单! 服务器同⼀时刻其实是给很多客户端 提供服务的。这么多客户端,每个人用的秘钥都必须是不同的(如果是相同那密钥就太容易扩散了,⿊客就也能拿到了)。因此服务器就需要维护每个客⼾端和每个密钥之间的关联关系,这也是个很麻烦的事情,所以方案1不行。
方案2:只使用非对称加密
鉴于⾮对称加密的机制,如果服务器先把公钥以明文方式传输给浏览器 ,之后浏览器向服务器传数据前都先⽤这个公钥加密好再传 ,从客户端到服务器信道似乎是安全的(有安全问题) ,因为只有服务器有相应的私钥能解开公钥加密的数据。但是服务器到浏览器的这条路不能保障安全,因为可以通过公钥解密。
方案3:双方都是用非对称加密
- 服务端拥有公钥S与对应的私钥S',客户端拥有公钥C与对应的私钥C'。
- 客户和服务端交换公钥。只有服务器有私钥S',只有客户端有私钥C'。
- 客户端给服务端发信息:先⽤S对数据加密,再发送,只能由服务器解密,因为只有服务器有私钥S'。
- 服务端给客户端发信息:先⽤C对数据加密,在发送,只能由客户端解密,因为只有客户端有私钥C'。
这样貌似也行啊,但是效率太低,而且与方案1相同,每个客户端用的非对称秘钥都必须是不同 ,很麻烦,依旧有安全问题后面讲。
方案4:非对称加密+对称加密
服务端具有非对称公钥S和私钥S'
- 客户端发起https请求,获取服务端公钥S。
- 客户端在本地生成对称密钥C,通过公钥S加密,发送给服务器。
- 由于中间的⽹络设备没有私钥,即使截获了数据,也无法还原出内部的原⽂,也就⽆法获取到对称密钥(真的吗?)
- 服务器通过私钥S'解密,还原出客⼾端发送的对称密钥C。并且使⽤这个对称密钥加密给客⼾端返回的响应数据。
- 后续客⼾端和服务器的通信都只⽤对称加密即可。由于该密钥只有客⼾端和服务器两个主机知道,其他主机/设备不知道密钥即使截获数据也没有意义。
第一次连接建立完成后,后续通信不再用 S 加密,而是用双方协商出来的对称会话密钥加密。 这里与方案1不同,对应关系只需要连接时建立。效率高,但也存在问题。
针对方案4 中间人攻击
最开始握⼿协商的时候就进⾏,假设hacker已经成功成为中间⼈
- 服务器具有⾮对称加密算法的公钥S,私钥S'
- 中间⼈具有⾮对称加密算法的公钥M,私钥M'
- 客⼾端向服务器发起请求,服务器明⽂传送公钥S给客⼾端
- 中间⼈劫持数据报⽂,提取公钥S并保存好,然后将被劫持报文中的公钥S替换成为自己的公钥M,并将伪造报⽂发给客⼾端
- 客⼾端收到报⽂,提取公钥M(⾃⼰当然不知道公钥被更换过了),⾃⼰形成对称秘钥X,⽤公钥M加密X,形成报⽂发送给服务器
- 中间⼈劫持后,直接用自己的私钥M'进行解密,得到通信秘钥X,再用曾经保存的服务端公钥S加密后,将报文推送给服务器
- 服务器拿到报⽂,⽤⾃⼰的私钥S'解密,得到通信秘钥X
- 双⽅开始采⽤X进⾏对称加密,进⾏通信。但是⼀切都在中间⼈的掌握中,劫持数据,进⾏窃听甚⾄修改,都是可以的
上⾯的攻击⽅案,同样适⽤于⽅案2,⽅案3

问题本质是客户端无法确定收到的就是目标服务器发送过来的。
3.CA证书
CA认证 :服务端在使⽤ HTTPS 前,需要向 CA 机构申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信息等。服务器把证书传输给浏览器,浏览器从证书⾥获取公钥就⾏了,证书就如身份证,证明服务端公钥的权威性。


其中公钥会随着CSR**(证书签名请求)**⽂件,⼀起发给CA进⾏权威认证,私钥服务端⾃⼰保留,⽤来后续进⾏通信(其实主要就是⽤来交换对称秘钥)。
数据签名 的形成是基于非对称加密算法的,注意,⽬前暂时和https没有关系,不要和https中的公钥私钥搞混了。

CA机构也有公钥和私钥 ,与服务器是区分的。上图中使用签名者的的私钥就是使用的CA的。证书=企业明文数据+签名。
- 中间人只改证书数据,最终数据指针会与CA公钥解出的数据指纹不同,不怕。
- 中间人只改数据签名,没有意义。
- 中间人把证书和签名全改了,但浏览器解密时只用CA的公钥解密,浏览器解不了密,我们拦截下来必须要用真的证书全部替换掉,但数据中方域名是唯一的,会暴露,客户端也会识别出证书是否合法。
客户端得到是证书+域名+公钥+CA签名(CA私钥),然后甄别,鉴别,从证书中提取公钥,之后在使用方案4。这说明客户端也都有 CA公钥,世界上只有CA有资格签发证书。使用的是浏览器/client 内置CA权威机构的公钥+证书(server的公钥)+非对称+对称的方案。
方案5:非对称+对称加密+证书认证
在客户端和服务器刚一建立连接的时候,服务器给客户端返回一个证书,证书包含了之前服务端的公钥,也包含了网站的身份信息。

csr 文件如何形成

就会生成私钥,公钥和证书,私钥保存好。
客户端浏览器验证证书时CA机构的公钥是保存好的,可以在浏览器查看

本篇结束!
