字节校招一面:聊聊Https 原理

开发 前端 应用安全
如果HTTP请求被某个不怀好意的中间人窃听截取,并且,消息包含银行密码等敏感信息的话,造成的后果不堪设想吧。

前言

大家好,我是田螺。

有位朋友校招面试了字节的后端岗位,问到这道面试题:https 原理。

这道题其实比较简单,我们如何更好地回答呢?我来跟大家聊聊。可以从这几个维度逐层扩展来讲

  • http为什么不安全?
  • 对称算法加密+HTTP
  • 非对称加密+HTTP
  • 非对称加密+对称加密+HTTP
  • 数字签名,给你的公钥盖个章
  • 完整的HTTPS运行流程图

1. http为什么不安全?

我们先来看看HTTP传输:

图片图片

  • 客户端,把一条消息,以明文的方式,发送到服务器。
  • 服务的响应报文,也是以明文的方式,发回给客户端。

Http 明文传输,主要有这些缺点:窃听风险、篡改风险、冒充风险

请君试想,如果HTTP请求被某个不怀好意的中间人窃听截取,并且,消息包含银行密码等敏感信息的话,造成的后果不堪设想吧。

2. 对称算法加密+HTTP

既然,明文传输不安全,那我们加密是不是就可以了。比如用对称加密算法加密。

  • 对称加密算法:需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。
  • 常见的对称加密算法有:DES、3DES、AES

看看用对称算法加密后,HTTP流程又是怎样的:

图片图片

  • 客户端把要发送的消息,用密钥加密成密文。
  • 客户端把密文发送到服务器。
  • 服务器收到密文消息,用同一把密钥把密文解密成明文。
  • 同理,服务端把消息报文返回给客户端,处理过程类似。

这种方式还是有问题:

一开始客户端怎么把密钥发过去呢?如果不怀好意的中间人截取到了密钥,发送的消息还是会被盗取和利用呢。

3. 非对称加密+HTTP

既然对称算法加密+HTTP 还是不够安全,那我们用非对称加密+HTTP。

什么是非对称加密算法?

  • 非对称加密算法需要两个密钥:公开密钥和私有密钥。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
  • 常用非对称加密算法:RSA、ECC

使用非对称加密算法之后,HTTP流程又是怎样的,如下图:

图片图片

  • 客户端向服务器发起HTTP请求
  • 服务端将自己的公钥返回到客户端。
  • 客户端使用返回的公钥,给要发送的消息加密。
  • 客户端将加密之后的消息密文发送给服务器。
  • 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后得到消息数据。

这种方式依然有问题:

非对称算法(如:RSA)有个弊端,它很慢。试想一下,如果你用浏览器请求,它很久才响应,你能接受吗?

4. 非对称加密+对称加密+HTTP

既然非对称加密慢。对称加密会快好多。我们可以使用非对称加密+对称加密双剑合璧的流程图如下:

图片图片

  • 客户端向服务器发起HTTP请求
  • 服务端将自己的公钥返回到客户端。
  • 客户端产生对称加密密钥,并用服务端返回的公钥对它加密
  • 客户端会发起第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
  • 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后得到客户端密钥,然后用客户端密钥对返回数据进行对称加密,这样数据就变成了密文。
  • 服务器将加密后的密文返回给客户端。
  • 客户端收到服务器发返回的密文,用自己的密钥(客户端密钥)对其进行对称解密,得到服务器返回的数据。

这种方式还是有问题,没完没了了。。。

如果中间人又来搞事情呢?要是中间人截取公钥,把公钥进行篡改呢? 打个比喻,把公钥比喻你自己的手机号,它是公开的,谁都可以给你打电话。假设你发消息给你朋友,告诉他你的手机号,然后消息被中间人截取修改了,改为110,然后你朋友不知情的情况下,拨通110,打电话给你。。。

5. 数字签名,给你的公钥盖个章

为了避免公钥被篡改,引入了数字证书,如图所下:

图片图片

  • 公钥和个人信息,经过Hash算法加密,形成消息摘要;将消息摘要拿到拥有公信力的认证中心(CA),用它的私钥对消息摘要加密,形成数字签名.
  • 公钥和个人信息、数字签名共同构成数字证书。

 证书验证

图片图片

  • 拿到数字证书之后,用同样的Hash算法, 先再次生成消息摘要;
  • 然后用CA的公钥对数字签名解密, 得到CA创建的消息摘要, 两者对比,就知道有没有人篡改了。

6. 完整的HTTPS运行流程图

图片图片

  1. 用户在浏览器里输入一个https网址,然后连接到server的443端口。
  2. 服务器必须要有一套数字证书,可以自己制作,也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过。这套证书其实就是一对公钥和私钥。
  3. 服务器将自己的数字证书(含有公钥)发送给客户端。
  4. 客户端收到服务器端的数字证书之后,会对其进行检查,如果不通过,则弹出警告框。如果证书没问题,则生成一个密钥(对称加密),用证书的公钥对它加密。
  5. 客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
  6. 服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后得到客户端密钥,然后用客户端密钥对返回数据进行对称加密,这样数据就变成了密文。
  7. 服务器将加密后的密文返回给客户端。
  8. 客户端收到服务器发返回的密文,用自己的密钥(客户端密钥)对其进行对称解密,得到服务器返回的数据。
责任编辑:武晓燕 来源: 捡田螺的小男孩
相关推荐

2022-03-30 10:10:17

字节码栈空间

2022-08-13 12:07:14

URLHTTP加密

2022-08-18 17:44:25

HTTPS协议漏洞

2024-10-15 10:59:18

Spring MVCJava开发

2022-10-10 08:13:16

递归通用代码

2024-10-31 08:50:14

2022-05-10 22:00:41

UDPTCP协议

2022-01-05 21:54:51

网络分层系统

2024-04-24 09:02:58

线程池面试锁升级

2022-06-01 11:52:42

网站客户端网络

2024-11-11 10:34:55

2022-11-30 17:13:05

MySQLDynamic存储

2022-05-11 22:15:51

云计算云平台

2022-10-19 14:08:42

SYNTCP报文

2024-05-15 16:41:57

进程IO文件

2024-09-26 06:48:36

2024-09-04 15:17:23

2022-12-02 13:49:41

2020-09-19 17:46:20

React Hooks开发函数

2009-07-30 14:38:36

云计算
点赞
收藏

51CTO技术栈公众号