应用层协议——HTTPS协议

上一章中我们学习了HTTP,这一章我们来学习一下HTTPS。

1. 为何引入HTTPS

HTTP看起来足够好了,为什么要使用HTTPS呢,原因是HTTP协议内容都是按照⽂本的⽅式明⽂传输的,这就导致在传输过程中出现⼀些被篡改的情况,例如:当我们登录微信时,对方能抓到我们的登录账号和密码,甚至能知道我们的支付密码,所以我们引入了HTTPS。

2. 什么是HTTPS

HTTPS也是⼀个应⽤层协议,是在HTTP协议的基础上引⼊了⼀个加密层TLS/SSL

TLS/SSL协议流程:

  • 客户端向服务器索要并验证服务器的公钥。
  • 双方协商生产「会话秘钥」。
  • 双方采用「会话秘钥」进行加密通信

前两步被称为TLS/SSL握手阶段。

经过TLS/SSL加密之后,就会将明文转化成密文,就能保证数据的安全性。

在网络传输中,通信双方都需要经过加密层TLS/SSL

3. 加密和解密

3.1 基本过程

加密就是把明⽂(要传输的信息)进⾏⼀系列变换,⽣成密⽂,解密就是把密⽂再进⾏⼀系列变换,还原成明⽂。

在这个加密和解密的过程中,往往需要⼀个或者多个中间的数据,辅助进⾏这个过程,这样的数据称为,密钥

举个例子:比如我现在有明文a和密钥key,我想将a数据传给对方,但是不能通过明文方式,我们可以对a加密。加密的方案有很多,例如我们可以让a ^ key加密成密文,再把密文传递给对方,对方拿到a ^ key之后,再拿密钥就能进行解密了。

3.2 为什么要加密解密

因为http的内容是明⽂传输的,明⽂数据会经过路由器、wifi热点、通信服务运营商、代理服务器等多个物理节点,如果信息在传输过程中被劫持,传输的内容就完全暴露了。劫持者还可以篡改传输的信息且不被双⽅察觉,这就是 中间⼈攻击 ,所以我们才需要对信息进⾏加密

例如:运营商劫持

我们想下载一个天天动听的软件,由于数据都是明文,运营商发现你要下载的是天天动听,直接给你改成了qq浏览器,用户在下载完之后才发现上当了。

不⽌运营商可以劫持,其他的⿊客也可以⽤类似的⼿段进⾏劫持,来窃取⽤⼾隐私信息,或者篡改内容。

在互联⽹上,明⽂传输是⽐较危险的事情!!!

3.3 常见加密方式

3.3.1 对称加密

  • 采⽤单钥密码系统的加密⽅法,同⼀个密钥可以同时⽤作信息的加密和解密,这种加密⽅法称为对称加密,也称为单密钥加密,特征:加密和解密所⽤的密钥是相同的
  • 常⻅对称加密算法(了解):DES、3DES、AES、TDEA、Blowfish、RC2等
  •  特点:算法公开、计算量⼩、加密速度快、加密效率⾼

对称加密就是只有一个密钥,加密和解密都使用同一个密钥。前面举的例子,按位异或就是一个比较简单的对称加密方式。

3.3.2 非对称加密

  • 需要两个密钥来进⾏加密和解密,这两个密钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
  • 常⻅⾮对称加密算法(了解):RSA,DSA,ECDSA
  • 特点:算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,⽽使得加密解密速度没有对称加密解密的速度快。
  • ⾮对称加密要⽤到两个密钥,⼀个叫做"公钥",⼀个叫做"私钥"。
  • 公钥和私钥是配对的,最⼤的缺点就是运算速度⾮常慢,⽐对称加密要慢很多。
  • 公钥和私钥的关系就像锁和钥匙,公钥加密只能私钥解密,私钥加密只能公钥解密

4.数据摘要和数据指纹

数字指纹(数据摘要),其基本原理是利⽤单向散列函数(Hash函数)对信息进⾏运算,⽣成⼀串固定⻓度的数字摘要。数字指纹并不是⼀种加密机制,但可以⽤来判断数据有没有被窜改。

他的特点是:一篇文章哪怕只修改了一个标点符号,数据摘要都要发生很大的变化。

和加密算法的区别是,摘要严格意义不是加密,因为没有解密,只不过从摘要很难反推原信息,通常⽤来进⾏数据对⽐。

以网盘功能为例:如果我们想保存一部电影,但是一部电影比较大,网盘并不会为我们每个人都保存一份,而是根据电影内容形成一段数据摘要,将摘要和电影内容保存在一起,当有人要保存电影时,先生成数据摘要,然后去数据库中查找,如果能找到,就把电影的资源链接复制给你,并不需要每个人都保存一份同样的资源。

5. HTTPS工作过程

5.1 方案一:只使用对称加密

如果通信双⽅都各⾃持有同⼀个密钥X,且没有别⼈知道,这两⽅的通信安全当然是可以被保证的(除⾮密钥被破解)

引⼊对称加密之后,即使数据被截获,由于⿊客不知道密钥是啥,因此就⽆法进⾏解密,也就不知道请求的真实内容是啥了。

但是实际情况中,双方是不可能提前知道密钥X的。首先,不可能在电脑出厂时就设置好密钥X,那么服务器就要维护很多个密钥X(不止一台主机要通信),大大增加了维护成本。

那么更好的方法就是双方在通信时,协商出一个密钥。

但是在第一次和对方协商密钥时,中间人也会拿到密钥,那么加密就形同虚设,毫无意义了。

所以:密钥的传输也需要加密

5.2 方案二:一方使用非对称加密

鉴于⾮对称加密的机制,如果服务器先把公钥以明⽂⽅式传输给浏览器,之后浏览器向服务器传数据前都先⽤这个公钥加密好再传,从客⼾端到服务器信道似乎是安全的(有安全问题),因为只有服务器有相应的私钥能解开公钥加密的数据。

但是服务器到客户端的这个方向上,数据是不安全的,因为所有的数据都是明文的

5.3 方案三: 双方都使用非对称加密

通信步骤:

  1. 服务端拥有公钥S与对应的私钥S',客⼾端拥有公钥C与对应的私钥C'
  2. 客⼾和服务端交换公钥
  3. 客⼾端给服务端发信息:先⽤S对数据加密,再发送,只能由服务器解密,因为只有服务器有私钥S'
  4. 服务端给客⼾端发信息:先⽤C对数据加密,在发送,只能由客⼾端解密,因为只有客⼾端有私钥C'

这种方案看似可以,双方传送的都是密文数据,但是存在两个问题:

  • 1.效率太低(双方都使用非对称加密)
  • 2.依旧存在安全问题(后面再说)

5.4 方案四:对称加密+非对称加密

针对方案三,我们先解决效率问题,具体步骤:

  1. 服务端具有⾮对称公钥S和私钥S'
  2. 客⼾端发起https请求,获取服务端公钥S
  3. 客⼾端在本地⽣成对称密钥C,通过公钥S加密,发送给服务器。
  4. 由于中间的⽹络设备没有私钥,即使截获了数据,也⽆法还原出内部的原⽂,也就⽆法获取到对称密钥(真的吗?)
  5. 服务器通过私钥S'解密,还原出客⼾端发送的对称密钥C,并且使⽤这个对称密钥加密给客⼾端返回的响应数据。
  6. 后续客⼾端和服务器的通信都只⽤对称加密即可,由于该密钥只有客⼾端和服务器两个主机知道,其他主机/设备不知道密钥即使截获数据也没有意义。

由于对称加密的效率⽐⾮对称加密⾼很多,因此只是在开始阶段协商密钥的时候使⽤⾮对称加密,后续的传输仍然使⽤对称加密

这种方案很不错,但是还是存在安全问题。

5.5 中间人攻击

前面所有的场景中,都存在一个问题,如果中间人从一开始就攻击了呢。

在⽅案2/3/4中,客⼾端获取到公钥S之后,对客⼾端形成的对称秘钥X⽤服务端给客⼾端的公钥S进⾏加密,中间⼈即使窃取到了数据,此时中间⼈确实⽆法解出客⼾端形成的密钥X,因为只有服务器有私钥S'但是中间⼈的攻击,如果在最开始握⼿协商的时候就进⾏了,那就不⼀定了。

对于方案四,我们加入中间人的过程:

  1. 服务器具有⾮对称加密算法的公钥S,私钥S'。
  2. 中间⼈具有⾮对称加密算法的公钥M,私钥M'。
  3. 客⼾端向服务器发起请求,服务器明⽂传送公钥S给客⼾端。
  4. 中间⼈劫持数据报⽂,提取公钥S并保存好,然后将被劫持报⽂中的公钥S替换成为⾃⼰的公钥M,并将伪造报⽂发给客⼾端
  5. 客⼾端收到报⽂,提取公钥M(⾃⼰当然不知道公钥被更换过了),⾃⼰形成对称秘钥X,⽤公钥M加密X,形成报⽂发送给服务器
  6. 中间⼈劫持后,直接⽤⾃⼰的私钥M'进⾏解密,得到通信秘钥X,再⽤曾经保存的服务端公钥S加密后,将报⽂推送给服务器
  7. 服务器拿到报⽂,⽤⾃⼰的私钥S'解密,得到通信秘钥X
  8. 双⽅开始采⽤X进⾏对称加密,进⾏通信。但是⼀切都在中间⼈的掌握中,劫持数据,进⾏窃听甚⾄修改,都是可以的

出现这个问题的本质就是,客户端无法得知他收到的公钥是否来自服务端,如果客户端能知道公钥是否来自服务端,那么问题就迎刃而解了。

5.6 引入证书

CA证书:服务端在使⽤HTTPS前,需要向CA机构申领⼀份数字证书,数字证书⾥含有证书申请者信息、公钥信息等服务器把证书传输给浏览器,浏览器从证书⾥获取公钥就⾏了,证书就如⾝份证,证明服务端公钥的权威性。

CA机构是一个非常权威的机构,

  • 服务端要提前准备好公钥与私钥,然后将域名,申请者,公钥等信息打包成csr文件提交给CA机构。
  • CA机构会对信息进行审核,如果审核通过,就会签发一个证书,如同身份证能确保你是一个合法的中国公民一样,证书能确保这是一个合法的网站。
  • 客户端收到服务端证书时,就能保证公钥一定来自服务端,不怕被替换。

证书是什么?

这个证书可以理解成是⼀个结构化的字符串,⾥⾯包含了以下信息:证书发布机构,证书有效期,公钥,证书所有者,签名等。

签名是什么?

签名的形成是基于⾮对称加密算法的,注意,⽬前暂时和https没有关系,不要和https中的公钥私钥搞混了。

当服务端申请CA证书的时候,CA机构会对该服务端进⾏审核,并专⻔为该⽹站形成数字签名,过程如下:

  1. CA机构拥有⾮对称加密的私钥A和公钥A'。
  2. CA机构对服务端申请的证书明⽂数据进⾏hash,形成数据摘要。
  3. 然后对数据摘要⽤CA私钥A'加密,得到数字签名S。

服务端申请的证书明⽂和数字签名S共同组成了数字证书,这样⼀份数字证书就可以颁发给服务端了

简单来说,一份证书中,包含明文信息和签名,签名就是明文信息经过单向散列(hash函数)后使用CA机构的私钥加密后的结果。

客户端如何保证一定能收到服务端的公钥。

当客⼾端获取到这个证书之后,会对证书进⾏校验(防⽌证书是伪造的)。

  1. 判定证书的有效期是否过期
  2. 判定证书的发布机构是否受信任(操作系统中已内置的受信任的证书发布机构)。
  3. 验证证书是否被篡改:从系统中拿到该证书发布机构的公钥,对签名解密,得到⼀个hash值(称为数据摘要),设为hash1,然后使用hash函数计算整个证书的hash值,设为hash2,对⽐hash1和hash2是否相等如果相等则说明证书是没有被篡改过的。

中间人篡改证书?

  • 中间⼈篡改了证书的明⽂由于他没有CA机构的私钥,所以⽆法hash之后⽤私钥加密形成签名,那么也就没法办法对篡改后的证书形成匹配的签名
  • 如果强⾏篡改,客⼾端收到该证书后会发现明⽂和签名解密后的值不⼀致,则说明证书已被篡改,证书不可信,从⽽终⽌向服务器传输信息,防⽌信息泄露给中间⼈

中间人掉包整个证书?

  • 因为中间⼈没有CA私钥,所以⽆法制作假的证书(因为客户端只会拿CA公钥解密)。
  • 所以中间⼈只能向CA申请真证书,然后⽤⾃⼰申请的证书进⾏掉包。这个确实能做到证书的整体掉包,但是别忘记,证书明⽂中包含了域名等服务端认证信息,如果整体掉包,客⼾端依旧能根据域名(不是我要访问的域名)等识别出来。

永远记住:中间⼈没有CA私钥,所以对任何证书都⽆法进⾏合法修改,包括⾃⼰的。

5.7 方案五:对称加密+非对称加密+证书

非对称加密+对称加密保证了通信的安全,并且提高了效率,数字证书保证了通信之前交换密钥的安全。

6. 常见问题

6.1 为什么摘要内容在⽹络传输的时候⼀定要加密形成签名?

常⻅的摘要算法有:MD5和SHA,以MD5为例,我们不需要研究具体的计算签名的过程,只需要了解MD5的特点:

  • 定⻓:⽆论多⻓的字符串,计算出来的MD5值都是固定⻓度(16字节版本或者32字节版本)
  • 分散:源字符串只要改变⼀点点,最终得到的MD5值都会差别很⼤。
  • 不可逆:通过源字符串⽣成MD5很容易,但是通过MD5还原成原串理论上是不可能的。

我们可以认为如果两个字符串的MD5值相同,则认为这两个字符串相同。理解判定证书篡改的过程:(这个过程就好⽐判定这个⾝份证是不是伪造的⾝份证)。


假设我们的证书只是⼀个简单的字符串hello,对这个字符串计算hash值(⽐如md5),结果为 BC4B2A76B9719D91。

如果hello中有任意的字符被篡改了,⽐如变成了hella,那么计算的md5值就会变化很⼤, BDBD6F9CF51F2FD8。

然后我们可以把这个字符串hello和哈希值BC4B2A76B9719D91从服务器返回给客⼾端。此时客⼾端只要计算hello的哈希值,看看是不是BC4B2A76B9719D91即可。

但是还有个问题,如果⿊客把hello篡改了,同时也把哈希值重新计算下,客⼾端就分辨不出来了呀

所以,对证书明⽂(这⾥就是“hello”)hash形成散列摘要,然后CA使⽤⾃⼰的私钥加密形成签名,将hello和加密的签名合起来形成CA证书,颁发给服务端,当客⼾端请求的时候,就发送给客⼾端,中间⼈截获了,因为没有CA私钥,就⽆法更改或者整体掉包,就能安全的证明,证书的合法性。

最后,客⼾端通过操作系统⾥已经存的了的证书发布机构的公钥进⾏解密,还原出原始的哈希值,再进⾏校验。

6.2 为什么签名不直接加密,⽽是要先hash形成摘要

缩⼩签名密⽂的⻓度,加快数字签名的验证签名的运算速度
 

7. 总结

HTTPS⼯作过程中涉及到的密钥有三组。

  • 第⼀组(⾮对称加密):⽤于校验证书是否被篡改。服务器持有私钥(私钥在形成CSR⽂件与申请证书时获得),客⼾端持有公钥(操作系统包含了可信任的CA认证机构有哪些,同时持有对应的公钥)。服务器在客⼾端请求时,返回携带签名的证书。客⼾端通过这个公钥进⾏证书验证,保证证书的合法性,进⼀步保证证书中携带的服务端公钥权威性。
  • 第⼆组(⾮对称加密):⽤于协商⽣成对称加密的密钥。客⼾端⽤收到的CA证书中的公钥(是可被信任的)给随机⽣成的对称加密的密钥加密,传输给服务器,服务器通过私钥解密获取到对称加密密钥。
  • 第三组(对称加密):客⼾端和服务器后续传输的数据都通过这个对称密钥加密解密

其实⼀切的关键都是围绕这个对称加密的密钥,其他的机制都是辅助这个密钥⼯作的。

  • 第⼆组⾮对称加密的密钥是为了让客⼾端把这个对称密钥传给服务器
  • 第⼀组⾮对称加密的密钥是为了让客⼾端拿到第⼆组⾮对称加密的公钥

8. Diffe-Hellman协议

上面的方案五的方法被称为RSA协议,在TLS中,早期版本支持RSA,但现代版本更推荐使用Diffie-Hellman(DH),因为它提供了更好的前向保密性。

  • RSA协议:在这种协议中,服务器拥有一对公钥和私钥,公钥是公开的,客户端在拿到服务端的公钥后,会生成一个对称密钥(也叫会话密钥),然后用服务端的公钥加密这个对称密钥,传输给服务端,服务端使用私钥解密得到这个对称密钥,然后双方就可以使用这个对称密钥进行通信了。这样即使有人拦截到了传输的密钥,由于他们没有服务器的私钥,也无法解密出对称密钥的内容。
  • DH协议:TLSv1.3就是采用这种协议。Diffie-Hellman密钥交换协议中,客户端和服务器都会生成一个随机数,然后互相交换后计算出一个共享的密钥,这个共享密钥就是后续通信的会话密钥。在这种协议中,即使有人拦截到了交换的随机数,由于他们没有参与计算,也无法得知会话密钥的内容。

前面说过TLS/SSL握手阶段:

  • 客户端向服务器索要并验证服务器的公钥。
  • 双方协商生产「会话秘钥」。

使用DH协议的TLS/SSL握手阶段以及通信过程

第一次握手:

  • 客户端向服务器发送一个“ClientHello”消息,这个消息中包含了
  • 1.客户端支持的TLS/SSL协议版本
  • 2.加密套件列表(包括加密算法和哈希算法)
  • 3.一个客户端生成的随机数(Client Random)

第二次握手:

  • 服务器收到“ClientHello”消息后,会选择一个合适的TLS/SSL协议版本、加密套件,并生成一个服务器随机数(Server Random)。
  • 服务器将其证书(包含公钥和由证书颁发机构签发的签名)发送给客户端。这个证书用于证明服务器的身份,并且允许客户端验证服务器的公钥。
  • 服务器发送一个“ServerHello”消息给客户端,这个消息中包含了服务器选择的协议版本、加密套件、服务器随机数,以及可能包含的其他参数(如会话ID或扩展)

第三次握手

  • 客户端收到服务器的证书后,使用内置的证书颁发机构(CA)的公钥来验证服务器证书的签名,以确保服务器的身份是合法的,并且服务器公钥是真实的。
  • 客户端使用验证过的服务器公钥加密一个“预主密钥”(Pre-Master),然后将这个加密后的预主密钥发送给服务器。预主密钥是随机生成的,并且在之后的步骤中会用来生成会话密钥(Master Secret)。

第四次握手:

  • 服务器使用自己的私钥解密客户端发送的预主密钥。
  • 客户端和服务器都使用预主密钥、客户端随机数、服务器随机数和特定的算法来计算会话密钥(Master Secret)。会话密钥将用于后续通信中的数据加密和解密。
  • 服务器向客户端发送一个“ChangeCipherSpec”消息,告知客户端后续的通信将使用新的加密参数。
  • 服务器向客户端发送一个“Finished”消息,这个消息是使用之前协商好的加密参数加密的,用于验证之前的握手过程是否成功。
  • 客户端也向服务器发送一个“ChangeCipherSpec”消息和一个“Finished”消息,以确认它也准备好开始使用新的加密参数进行通信。

握手阶段结束,双方开始正常使用会话密钥进行通信。

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值