面试官:你觉得HTTPS能防止重放攻击吗?

news2024/11/25 6:56:24

引言

先来一段面试情景再现~~

编辑切换为居中

添加图片注释,不超过 140 字(可选)

最后的结局自然就是

编辑切换为居中

添加图片注释,不超过 140 字(可选)

OK,带着上面的疑问,开始我们今天的文章!

正文

协议流程

我们先来回忆一下HTTPS的通信流程,HTTPS协议 = HTTP协议 + SSL/TLS协议,摘取一下网上一些八股文的回答(以RSA密钥交换的为例)!

  • (1)客户端生成一个随机数client_random,TLS版本号,发送到服务端

  • (2)服务端发送自己的随机数server_random,服务器使用的证书,发送到客户端

  • (3)客户端利用CA公钥对证书进行验证,取出服务器公钥

  • (4)客户端生成随机数pre_master_secret,利用服务器公钥进行加密,传送到服务端

  • (5)服务端利用服务器私钥进行解密取出pre_master_secret

  • (6)服务端和客户端此时利用随机数client_random,server_random,pre_master_secret算出对称密钥(master_secret),利用对称密钥进行对称加密通信

画外音:是不是贼熟悉,有背过网络八股文的,一看就懂!

关键问题就在步骤(6),怎么进行加密的?很多文章都没有说明,甚至有的人以为,拿client_random+server_random+pre_master_secret直接拼成一个字符串,然后就是对称加密密钥,客户端和服务端拿这个密钥对数据进行加密通信!!

对此,我只能说:"Too young too simple!离谱啊!!"

那正确的过程是怎么样的呢,我们继续往下看!

协议分析

我先给本文提到的英文单词,给上我的中文翻译,以防大家混淆:

  • client_random 客户端随机数

  • server_random 服务端随机数

  • pre_master_secret 预备主密钥

  • master_secret 主密钥

  • key_block 密钥块(有的文章把这个东西称为会话密钥)

先大致有个印象,继续往下阅读

现在我们已经有三个参数client_random,pre_master_secret,server_random,服务端和客户端分别会根据这三个参数,推导出master_secret,一旦master_secret被推导出来,会立刻删除pre_master_secret。(摘自rfc2246,section8.1)

当master_secret计算出以后,立刻计算key_block(摘自rfc2246,section6.3),这个密钥块,有的文章里又说他是会话密钥!计算公式如下,

 
 

key_block = PRF(master_secret, "key expansion", server_random + client_random)

如公式所示,PRF是一个Hash算法,如SHA256这些,具体用哪一个取决于TLS协议的版本!我们得到key_block后,可以基于到key_block继续推导出6个密钥值,分别是

  • client_write_MAC_key 客户端消息认证码密钥

  • server_write_MAC_key 服务端消息认证码密钥

  • client_write_key 客户端对称加密密钥

  • server_write_key 服务端对称加密密钥

  • client_write_IV 客户端初始化向量

  • server_write_IV 服务端初始化向量

整个过程用一张图来说明,注意了这六把密钥是根据key_block推导而出,也就是意味着这六把密钥是服务端和客户端共同持有的!

编辑切换为居中

添加图片注释,不超过 140 字(可选)

大家一定也发现了,你的密钥前都带有client或者server前缀,这代表密钥是服务端使用还是客户端使用!例如,客户端用client_write_key进行数据加密,发送数据,服务端收到消息后利用client_write_key进行解密。而后服务端使用server_write_key进行数据加密回复信息,客户端收到消息后用server_write_key解密服务端发来的信息!

OK,我们继续往下看! 现在我们已经有了6把密钥了,已经需要发送的消息data,那么加密流程具体怎么样的呢? TLS一共有三种加密模式,流加密模式、分组模式、 AEAD 模式,我以流加密模式来进行说明,如下图所示

编辑切换为居中

添加图片注释,不超过 140 字(可选)

我们现在来看上面的第二步,利用write_mac_key对数据加密,加上MAC验证码,利用MAC码来保证完整性。

那么,这个MAC验证码的生成公式又是怎么样的呢?

MAC验证码

在流加密模式下,MAC验证码公式为(摘自rfc2246,section6.2.3.1)

编辑切换为居中

添加图片注释,不超过 140 字(可选)

看到入参中的seq_num了么?这就是数据的序列号,这个序号就是用来防止重放攻击的!那这个序列号怎么用的呢? 假设,此时服务端和客户端连接成功后 (1)客户端会在内存中记录 client_send 和 client_recv,默认值为0.客户端每发送一条消息,client_send 会加1,每接收一条服务端发来的消息,client_recv 会加1。 (2)服务端也会在内存中记录 server_send 和 server_recv,作用和客户端的作用一样。服务端每发送一条消息,server_send 会加1,每接收一条客户端发来的消息,server_recv 会加1。 (3)客户端发送数据时,以当前client_send作为seq_num,计算mac值,发送给服务端,然后client_send加1。 (4)服务端收到消息后,先以当前server_recv值,进行完整校验,校验成功后server_recv加1。然后以server_send为作为seq_num,计算mac值,发送给客户端,然后server_send加1。 (5)也就是说,如果发送和接收都正常,那么 client_send = server_recv、client_recv = server_send

假设,客户端和服务端相互通信了4次,client_send = server_recv=3(从0开始,所以是3),服务端检验完第4次消息后,server_recv加1,此时server_recv=4。攻击者如果想重放第4次消息,第4次消息中的client_send值是3,就会出现校验失败的情况!从而能够抵挡住重放攻击!

OK,讲到这里,基本上能回答最开始提出的问题了!

当然,TLS协议本身的内容比较多,我在这里放上TLS协议的地址,大家有兴趣可以自己去查看: https://www.rfc-editor.org/rfc/rfc2246.html

思考

假设,我们用符号[]表示一次TCP连接,0,1,2,...代表数据包序号,根据上面的分析,对于这种形式的重放攻击,[0,0,0,1,1,2,2,3,3,3….],HTTPS协议是能够拦截的! 那如果不是一次请求里的重放攻击呢?例如形式是[0,1,2,3….],[0,1,2,3….],这种形式的重放攻击,HTTPS协议能够拦截么?有答案,可以在留言区进行回复!

提示:想一想看,最开始的客户端随机数和服务端随机数的作用!

                                            资源获取:

大家点赞、收藏、关注、评论啦 、查看👇🏻👇🏻👇🏻微信公众号获取联系方式👇🏻👇🏻👇🏻

 精彩专栏推荐订阅:下方专栏👇🏻👇🏻👇🏻👇🏻

每天学四小时:Java+Spring+JVM+分布式高并发,架构师指日可待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/90662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SpringCloud负载均衡】【源码+图解】【四】负载均衡的实现

【SpringCloud负载均衡】【源码图解】【三】LoadBalancer的工作原理 目录4. 负载均衡4.1 提供者DiscoveryClient4.1.1 CompositeDiscoveryClient4.1.2 EurekaDiscoveryClient4.1.3 SimpleDiscoveryClient4.1.4 自定义DiscoveryClient4.2 过滤器Supplier4.2.1 CachingServiceIns…

Linux文本三剑客之grep命令

Linux文本三剑客之grep命令 1. grep 命令 介绍 grep 命令的基本语法格式和参数列表! 文本搜索工具,根据用户指定的”模式”对目标文本逐行进行匹配检查,打印匹配到的行。 模式:由正则表达式字符及文本字符所编写的过滤条件&am…

MySQL 中截取字符串的方法

LEFT(str, len) 从左边开始截取,如果字符串为 null 则返回null。 str:被截取字符串;len:截取长度 SELECT LEFT(ABCDEFT, 2) FROM sub_str;RIGHT(str, len) 从右边开始截取,如果字符串为 null 则返回null。 str&…

0125 搜索与回溯算法 Day14

剑指 Offer 12. 矩阵中的路径 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻…

GLAD:带有反射壁的空心波导

概述 离散傅里叶变换的混叠效应为带有反射壁的空心波导的建模提供了一个便捷的方法。反射壁可以将光返回到光路中而混叠效应将使溢出光场从反方向折回到采样光场中。如果光场分布是一个偶函数,那么折回的作用就如同反射效果。我们可以将任意形状的光场分布转化成…

推荐一款免费的AI绘图软件,可生成二次元画作和3D模型

随着AI绘画的火热,市面上关于AI绘画的话题居高不小,各种教程、软件、小程序也是满天飞,在这些眼花缭乱的推荐中,究竟哪一款ai绘图软件才是真正适合自己的,不但免费,生成出来的二次元画作还很精美&#xff1…

早教资源网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 网站前台:关于我们、联系我们、公告信息、二手物品、资源信息 管理员功能: 1、管理关于我们、联…

Django 第三天学习笔记

1.模板层-变量和标签 能够传递到Django模板中的数据类型: 1.str 字符串 2.Int 整形 3.List 数组 4.Tuple 元组 5.Dict 字典 6.Func 方法 7.Obj 类的实例化对象。 在模板中使用的变量的语法: {{变量名}}{{变量名.index}} #索引{{变量名.key}} #获取字典对…

数据结构顺序栈

栈 这是大话数据结构种对于栈的描述 可以看到 栈是一种特殊的线性表 它只能在尾部进行元素的插入和删除 但是在栈种 这叫做 入栈 和 出栈 而且它遵循 先进入的元素后出 后进入的元素先出 即就是我们常听说的 先进后出 和后进先出 这里就有一个简单的例子 先进后出 后进先出…

【Node.js】实现微信小程序在线支付功能

实战项目名称:微信小程序实现在线支付功能 - 文章结尾附上微信小程序码,扫码登录后即可体验!! 文章目录一、实战步骤1. 前期准备2. 添加wechatpay-node-v3和fs插件3. 预设微信下单的数据4. 将上一步骤的下单信息返回给前端5. 小程…

在抖音全程看世界杯,超高清直播背后的硬实力

导语:IT技术赛场开赛!作者 | 宋慧 出品 | CSDN(ID:CSDNnews)当前,2022 卡塔尔世界杯比赛正在如火如荼进行中,处在更加激烈关键的半决赛阶段。作为足球运动的全球顶级赛事,世界杯…

SysML图例-核聚变

DDD领域驱动设计批评文集>> 《软件方法》强化自测题集>> 《软件方法》各章合集>> [新闻]核聚变里程碑式突破>> SysML图中词汇: Tokamak: 一种利用磁约束来实现受控核聚变的环形容器,通过约束电磁波驱动&#xff…

如何形成前端知识体系

来啦各位大佬~但很不好意思,我就是标题党,这篇博文并没有很明确的给出「如何形成前端知识体系」答案,我自学前端,在面试字节的时候,字节的大佬说我的知识点没有成体系,很零散的飘在各个地方&…

面试官:你如何实现大文件上传

提到大文件上传,在脑海里最先想到的应该就是将图片保存在自己的服务器(如七牛云服务器),保存在数据库,不仅可以当做地址使用,还可以当做资源使用;或者将图片转换成base64,转换成buff…

怎么复制网页上不能复制的文字(付费文档免费复制),一招搞定

好多小伙伴上网查资料的时候,想要复制网页内容,但是提示付费复制或者不允许复制,遇到这种情况怎么办呢?下面就是小编分享的一招搞定无法复制网页内容文字的方法。 怎么复制网页上不能复制的文字 借助360安全浏览器/360极速浏览器…

Minecraft 1.19.2 Forge模组开发 06.建筑生成

1.12.2自定义建筑生成 1.16.5自定义建筑生成 1.18.2自定义建筑生成 我们本次尝试在主世界生成一个自定义的建筑。 效果展示效果展示效果展示 由于版本更新缘故,1.19的建筑生成将不涉及任何Java包的代码编写,只需要在数据包中对建筑生成进行自定义。 …

基于粒子群优化算法的BP神经网络预测模型(Matlab代码实现)

目录 1 概述 2 粒子群优化算法 3 BP神经网络 4 PSO优化 BP网络算法 5 运行结果 6 参考文献 7 Matlab代码实现 1 概述 在工程应用中经常会遇到一些复杂的非线性系统,这些系统的状态方程复杂,难以准确的用数学方法建模,而BP神经网络实质上实现了一个从输入到输出的映射功…

【k8s】Kubernetes 基础组件详解

一、k8s简介 Kubernetes 是容器集群管理系统工具,是一个开源平台,可实现容器集群的自动化部署、自动扩缩容、维护等功能。Kubernetesk8s是Kubernetes的缩写,Google 于 2014 年开源了 Kubernetes 项目,Kubernetes的名字来自希腊语&…

无延时直播/超低延时直播实际测试延时效果(项目实测组图)

阿酷TONY / 2022-11-30 / 长沙 / 超多组图 无延时直播/超低延时直播,主要只测试延时情况,没有涉及直播产品的功能、使用操作界面,有兴趣的朋友可以加联系我实际测试哦~~~ 1.无延时直播应用场景 无延时直播/超低延时常见应用场景&#…

近90天互动量破百万,「围炉煮茶」究竟做对了什么?

今年秋冬,“围炉煮茶”爆红网络。小红书相关笔记数量突破8万,累计话题浏览量1200万次,近90天互动量破百万! 茶,从老一辈的茶杯茶盘里,通过创新再造,成为年轻人的社交“新”头好。高流量曝光、高…