信息安全学习4. 重放攻击的概念与防范
wptr33 2025-06-04 02:10 17 浏览
一、 定义
重放攻击(Replay Attacks)又称为重播攻击、回放攻击,一般是攻击者截获数据包后,无法解密数据,但可以把数据包和业务间的关系进行猜测,重新发送相同数据包,来达到欺骗系统的目的,主要用于身份认证过程、破坏认证的正确性。
重放攻击可以由发起者、或拦截方进行。拦截方进行的重放攻击又称为中间人攻击。
重放攻击基于网络嗅探。很多时候嗅探到的数据是加密过的,但攻击者虽然无法解密,但如果攻击者知道数据的意义,就可以发送这些数据来攻击接收端。
在物联网场景中,攻击者可以利用这种攻击控制用户的设备。
二、类型
根据重放消息的接收方与消息的原定接收方的关系,重放攻击可分为3种:
- 直接重放,即重放原来的验证端,直接重放的发送方和接收方均不变
- 反向重放,将原本发给接收方的消息反向重放给发送方
- 第三方重放,将消息重放给域内的其它验证端。
三、防御方案
1. 加随机数nonce
nonce是仅一次有效的随机字符串,一般可以使用时间戳和客户端其它唯一性参数进行哈希运算。
优点:认证双方不需要时间同步,双方记住使用过的随机数,如果报文中有以前使用过的随机数,认为是重放攻击。
缺点:需要额外保存使用过的随机数,需要保存和查询开销,服务器端存放hash值的库会越来越大,要进行定期清理。定期清理后重放攻击也许会生效。
2. 加时间戳timestamp
在通讯中加入时间戳,时间差大于一定阈值的请求视为攻击。
优点:不需要额外保存信息
缺点:双方需要准确的时间同步,同步越好,受攻击的可能性越小。对于分布式的分布,同步精确的时间并不容易;另外很多小型物联网设备,可能缺少精确的计时时钟。
3. 加流水号
双方在报文中添加一个逐步递增的整数,只要接收到一个不连续的流水号报文(太大或太小),就认定有重放威胁。
优点:不需要时间同步,保存的信息量小
缺点:攻击者如果对报文解密成功,就可以获得流水号,从而伪造数据。
4. 挑战-应答机制
- 客户端请求服务器
- 服务器先成一个随机数,发给客户端,每次随机数都有变化
- 客户端带上这个随机数,访问服务器
- 服务器验证如果随机数相同,不是重放攻击
5. 一次性口令机制
6. SSL/TLS
对于web或socket通讯,加上SSL/TLS 可以有效防止基于中间人的重放攻击。
- 每个socket连接需要使用证书校验,新建的socket连接握手后是新的密钥
- 使用双向认证可以更好地提高安全性
- SSL/TLS可以防止中间人的重放攻击,但攻击者占有设备时仍可以自己建立联接、不停发起某个请求,业务层面还是需要另外的防重放攻击机制。(比如一个转账请求,攻击者直接在自己手机上截获请求并重发,服务器应该在SSL/TLS外还进行业务层面的限制)。
7. 联合方案
实际应用中常将1、2组合使用,保存某个时间段内的所有随机数,而且时间戳的同步也不需要太精确。
验证流程(PHP代码示例):
//判断stime参数是否有效
if( $now - $stime > 60){
die("请求超时");
}
//判断nonce参数是否在“集合”已存在
if( in_array($nonce,$nonceArray) ){
die("请求仅一次有效");
}
//验证数字签名
if ( $sign != md5($uid.$token.$stime.$nonce) ){
die("数字签名验证失败");
}
//判断是否需要清理nonce集合
if( $now - $nonceArray->lastModifyTime > 60 ){
$nonceArray = null;
}
//记录本次请求的nonce参数
$nonceArray.push($nonce);
//开始处理合法的请求
四、注册登陆过程加强安全
1. 注册
- 用户提交的密码在客户端进行一次sha256运算
- 运算后的值,在服务器与随机生成的复杂盐值合并,再进行sha256
- 存入数据库
2. 登陆
- 进入登陆页面时,生成一个随机码,在客户端、服务端保存;
- 客户端登陆,将sha256之后的密码与随机码拼接,再次计算sha256,把这个数据和时间戳提交服务端:
提交的到服务器的数据=sha256(sha256(密码明文)+随机码)) - 服务端接收到请求,不仅较验运算后的密码,还要校验随机数、时间戳的有效性。
相关推荐
- redis的八种使用场景
-
前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...
- 基于Redis的3种分布式ID生成策略
-
在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...
- 基于OpenWrt系统路由器的模式切换与网页设计
-
摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...
- 这篇文章教你看明白 nginx-ingress 控制器
-
主机nginx一般nginx做主机反向代理(网关)有以下配置...
- 如何用redis实现注册中心
-
一句话总结使用Redis实现注册中心:服务注册...
- 爱可可老师24小时热门分享(2020.5.10)
-
No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...
- Apportable:拯救程序员,IOS一秒变安卓
-
摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...
- JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透
-
以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...
- 3月26日更新 快速施法自动施法可独立设置
-
2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...
- Redis 是如何提供服务的
-
在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...
- lua _G、_VERSION使用
-
到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...
- China's top diplomat to chair third China-Pacific Island countries foreign ministers' meeting
-
BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...
- 移动工作交流工具Lua推出Insights数据分析产品
-
Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...
- Redis 7新武器:用Redis Stack实现向量搜索的极限压测
-
当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...
- Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求
-
重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...
- 一周热门
-
-
C# 13 和 .NET 9 全知道 :13 使用 ASP.NET Core 构建网站 (1)
-
因果推断Matching方式实现代码 因果推断模型
-
git pull命令使用实例 git pull--rebase
-
git pull 和git fetch 命令分别有什么作用?二者有什么区别?
-
面试官:git pull是哪两个指令的组合?
-
git 执行pull错误如何撤销 git pull fail
-
git fetch 和git pull 的异同 git中fetch和pull的区别
-
git pull 之后本地代码被覆盖 解决方案
-
还可以这样玩?Git基本原理及各种骚操作,涨知识了
-
git命令之pull git.pull
-
- 最近发表
- 标签列表
-
- git pull (33)
- git fetch (35)
- mysql insert (35)
- mysql distinct (37)
- concat_ws (36)
- java continue (36)
- jenkins官网 (37)
- mysql 子查询 (37)
- python元组 (33)
- mybatis 分页 (35)
- vba split (37)
- redis watch (34)
- python list sort (37)
- nvarchar2 (34)
- mysql not null (36)
- hmset (35)
- python telnet (35)
- python readlines() 方法 (36)
- munmap (35)
- docker network create (35)
- redis 集合 (37)
- python sftp (37)
- setpriority (34)
- c语言 switch (34)
- git commit (34)