HTTPS

目录

HTTPS是什么

加密是什么

对称密码算法

非对称密码算法

摘要算法

HTTPS的工作过程

引入对称加密

引入非对称加密

中间人攻击

引入证书

数字签名

通过证书解决中间人攻击

总结


HTTPS是什么

HTTPS(HyperText Transfer Protocol Secure):也是一个应用层协议,是 HTTP 的安全版,即 HTTP + SSL(加密层),在 HTTP 协议的基础上引入了加密层,确保在客户端和服务器之间传输的数据是加密的、完整的和安全的

为什么需要使用 HTTPS?

HTTP 协议内容都是按照文本的方式进行明文传输的,这就导致在传输过程中比较危险,可能会被黑客劫持,从而窃取用户隐私信息,或是篡改内容,而 HTTPS 则在 HTTP 的基础上进行了加密,进一步保证用户的信息安全

加密是什么

加密(Encryption):将 明文(原始数据,即需要传输的信息)通过使用密码算法(也就是一系列计算和变换转换为 密文(加密数据,无法直接理解或解读的信息)的过程

解密(Decryption):将 密文(加密过的数据) 转换为 明文(原始数据)的过程

在加密和解密的过程中,需要使用一个或多个中间数据,来辅助我们进行这个过程,这样的数据称为 密钥

我们以一个非常经典的例子:凯撒密码来进一步理解加密和解密的过程

凯撒密码(Caesar Cipher)是一种简单的替换加密技术,通过将字母表中的每个字母向后移动固定数量的位置来加密消息

其中 字母表中的每个字母向后移动固定数量的位置 就是密钥 k

加密过程:

1. 选择一个固定的整数作为密钥(偏移量)

2. 将明文中的每个字母按照偏移量向后移动

解密过程:

解密过程与加密过程相反,将密文中的每个字母向前移动偏移量的位置即可恢复原文

在进行加密和解密的过程中,我们需要使用到密码算法,而密码算法主要分为三类:对称密码算法、非对称密码算法和摘要算法

关于具体的密码算法如何实现的,在这里并不进行过多介绍,我们只简单学习这三种算法是如何进行加密和解密的

对称密码算法

对称密码算法:对称密码算法使用相同的密钥来进行加密和解密。这意味着在加密和解密过程中都使用相同的密钥。对称密码算法通常比非对称密码算法更快速,因为它们不涉及复杂的数学运算(上述 凯撒密码 就是对称加密)

我们可以将加密的过程看做数学中计算 y = f(x) 的过程,其中 x 为明文,y 为密文,f( )表示不同的加密算法,通过 f(x) 计算密文y

对于对称加密,由于其在加密和解密过程中使用相同的密钥,即

计算密文:y = f(x)

计算明文:x = f(y)

非对称密码算法

非对称密码算法:非对称密码算法使用一对密钥,即公钥和私钥,来进行加密和解密。这意味着使用公钥对数据进行加密后,只有持有相应私钥的实体才能解密数据。非对称密码算法也被称为公钥密码算法,相对于对称密码算法来说,它提供了更好的密钥管理和安全性。

同样的,我们将加密的过程看做数学中计算 y = f(x) 的过程

而对于非对称加密,其使用用户公钥进行加密,私钥进行解密,即

计算密文:y = f(x)

计算明文:x = m(y)

其中 x 为明文,y 为密文,f( )表示加密算法(也可看做公钥),通过 f(x) 计算密文y;m( )表示解密算法(也可看做私钥),通过m(y)计算明文

摘要算法

摘要算法:摘要算法也称为哈希函数,是一种将任意长度的输入消息转换为固定长度的输出值(哈希值)的算法

同样的,我们将加密的过程看做数学中计算 y = f(x) 的过程,其中 x 为明文,y 为密文,f( )表示加密算法

对于摘要算法,可以通过y = f(x)计算密文,而无法通过密文计算明文

摘要算法具有以下特性:

固定长度输出:摘要算法生成的哈希值长度是固定的,不受输入消息长度的影响。

唯一性:对于不同的输入消息,摘要算法应该生成不同的哈希值。理想情况下,不同的输入应该产生唯一的哈希值,但由于输出空间有限,可能存在碰撞(多个不同的输入生成相同的哈希值)。

不可逆性:从哈希值推导原始输入消息应该是困难的,即使在已知哈希值的情况下,也应该难以确定原始输入消息。

抗碰撞性:摘要算法应该具有良好的抗碰撞性,即在计算上难以找到两个不同的输入消息产生相同的哈希值。

HTTPS的工作过程

要保证数据的安全,就需要进行加密,此时网络中就不再直接传输明文了,而是加密后的 密文

引入对称加密

对称加密就是通过同一个密钥,将明文加密成密文,也能把密文解密成明文

先通过对称加密,针对 HTTP中的 header 和 body 进行加密

引入对称加密后,即使数据被截获,由于黑客不知道密钥,因此也就无法解密

但此时出现了一个问题:

由于服务器同一时刻是给很多客户端提供服务的,这么多的客户端,每个人使用的密钥都必须是不同的(若是相同的则密钥容易扩散,那么黑客也就很容易拿到密钥),因此,服务器就需要维护和每个密钥之间的关联关系

此时服务器要维护的内容就会很多,因此,更好的方法,是客户端和服务器在建立连接时,双方协商确定本次的密钥是什么

但此时若直接将密钥明文传输,那么黑客也就能获取到密钥,那之后的加密就没有意义了,若再对密钥进行对称加密,就仍需要协商一个 "密钥的密钥",此时又会涉及到明文传输问题

此时的密钥传输使用对称加密就行不通了,就需要引入 非对称加密

引入非对称加密

非对称加密需要使用两个密钥,一个是 "公钥",一个是 "私钥"

公钥和私钥是配对的,但其缺点是运算速度较慢,比对称加密慢得多

通过 公钥 对 明文 进行加密,变成 密文

通过 私钥 对 密文 进行解密,变成 明文

也可以反着用:

通过 私钥 对 明文 进行加密,变成 密文

通过 公钥 对 密文 进行解密,变成 明文

此时:


 

服务器生成一对非对称密钥(公钥为pub,私钥为 pri),客户端生成对称密钥 key

客户端向服务器发送请求,获取到 公钥pub

客户端使用 pub 对 key 进行非对称加密,并传输

此时黑客截取到的密钥是 pub 加密后的结果,黑客要是想要解密,就需要知道 pri,然而 pri 私钥只有服务器自己知道,黑客拿不到

客户端获取公钥、双方协商对称密钥的过程都是在 SSL 内部完成的工作,使用 HTTPS 的时候,底层也是 TCP。客户端和服务器进行通信时,先进行 TCP 三次握手,TCP 连接打通之后,就进行 SSL 的握手(交互密钥的过程),之后才是业务数据的传输

引入非对称加密,主要是针对 对称密钥 的传输进行加密,那为什么不直接使用 非对称加密 对 数据 进行加密?

非对称加密系统的开销远远大于对称加密,因此,也就不太适合使用非对称加密针对大规模的数据进行加密

此时能够保证密钥的安全传输,但此时黑客仍然有办法获取到对称密钥 key,也就是通过 中间人攻击

中间人攻击

服务器可以创建出一对公钥和私钥,那么黑客也可以按照同样的方式(生成公钥和私钥的算法是开放的)创建出一对公钥和私钥,此时,黑客就可以冒充自己是服务器

黑客劫持客户端发送的数据报文,将自己生成的公钥(pub1)返回给客户端,同时将数据报文发送给服务器,黑客保存好服务器公钥 pub

客户端收到报文后,就会采用 pub1 对 key 进行加密,此时黑客使用自己的私钥 pri1 进行解密,就能够获取到密钥key,黑客再用服务器的公钥pub 对 key 进行加密,发送给服务器

服务器接收到报文后,使用自己的私钥 pub 进行解密。得到通信密钥key

之后,客户端和服务器使用 key 进行对称加密,进行通信,但此时一切都在黑客(中间人)的掌握中,劫持数据,进行监听或是修改

其中关键的一点就在于客户端无法验证返回的报文是由 服务器 发送的还是由 黑客(中间人)发送的

要想解决这个问题,就需要使用数字证书

引入证书

服务器在使用 HTTPS 之前,需要向 CA机构(证书的签发机构,负责签发证书、认证证书、管理已颁发证书的机关申请一份数字证书,数字证书中包含了证书申请者信息、公钥信息等,服务器将证书传给浏览器,浏览器就可以从证书中获取公钥了,证书就像是身份证,证明服务器公钥的权威性

CA本身有自己的证书,用来证明CA(证书颁发机构)的身份,本质是一份普通的数字证书,而浏览器中通常会内置大多数主流权威CA的证书 

数字证书可以理解为一个结构化的字符串,其中包含的信息有:

证书发布机构

证书有效期

证书持有者的公钥

证书所有者

证书签名时用到的hash算法

签名

...... 

服务器首先生成一对公钥和私钥,在申请证书时,该证书内就会包含服务器的公钥信息

客户端拿到了服务器的证书后,对证书进行验证,在校验过程中,需要使用数字签名 

 那么,什么是数字签名? 

数字签名

数字签名:是一种用于确保数字信息完整性和认证发送者身份的技术手段,签名的形成是基于非对称加密算法的

当服务器申请CA证书时,CA机构会对该服务器进行审核,并为该网址生成 数字签名

1. CA机构持有用于非对称加密的私钥A和公钥A'

2. CA机构对服务器申请的证书明文数据进行 hash,形成数据摘要

3. 然后对数据摘要使用 私钥A 进行加密(签名),得到数字签名s

服务端申请的 证书明文 和 数字签名s 共同构成数字证书

通过证书解决中间人攻击

在客户端和服务器刚建立连接时,服务器会给客户端返回一个证书

客户端在拿到证书后,会进行:

1. 判定证书的有效期是否过期

2. 判定证书的发布机构是否受信任

3. 验证证书是否被篡改

验证过程: 

(1)按照同样的算法,将证书的明文数据进行hash,得到数据摘要 hash1

(2)通过CA机构的公钥A',对证书中的签名进行解密,得到数据摘要 hash2

此时,就可以对比这两次得到的数据摘要是否一致,若一致,则说明证书未被修改过;若不一致,则说明证书被别人篡改过

操作系统中会内置受信任的证书发布机构,若没有,也可以额外进行安装 

那么,中间人能否篡改证书呢?

若中间人篡改了证书明文,由于他没有CA机构的私钥,也就无法在hash之后使用私钥加密形成签名,也就没有办法为篡改后的证书形成匹配的签名

若强行篡改,客户端收到该证书后会发现明文hash后得到的数据摘要和签名解密后的值不一样,则说明证书不可信,从而终止向服务器传输信息,防止信息泄露给中间人

既然如此,那中间人能否掉包证书?

由于中间人没有 CA 机构的私钥,也就无法制造假的证书,因此中间人只能向CA申请真的证书,然后用自己申请的证书进行掉包,但证书明文中包含了域名等服务端认证信息,若整体掉包,客户端依然能够识别出来

在进行签名时,为什么签名不直接对数据进行加密,而是要先hash形成摘要呢?

这是为了缩小密文的长度,加快数字签名验证签名的运算速度

总结

HTTPS 工作过程中涉及到的密钥有 3 组:

第一组(非对称加密):用于校验证书是否被篡改。CA机构持有私钥,客户端持有公钥,客户端通过这个公钥解密获得数据摘要,从而校验证书的内容是否被篡改过

第二组(非对称加密):用于协商对称加密的密钥。服务器生成这组密钥对(公钥和私钥),然后通过证书把公钥传递给客户端,客户端用这个公钥为生成的对称密钥加密,传输给服务器,服务器通过私钥解密获得对称加密密钥

第三组(对称加密):用于对传输数据进行加密。客户端和服务器后续传输的数据都通过这个对称密钥加密解密

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

第二组非对称加密的密钥是为了让客户端把这个对称密钥传递给服务器

第一组非对称加密的密钥是为了让客户端拿到第二组非对称加密的密钥

  • 24
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠枬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值