防重放

2023-10-18 03:32
文章标签 防重

本文主要是介绍防重放,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

使用场景 :

  当系统需要与云平台进行对接时,常常会使用api鉴权对权限进行鉴定,我们使用的api鉴权方式即为aksk鉴权,简单而言就是通过签名验证是否具有权限。

假设 :

  AKSK鉴权并非该帖子的主题,先略过,假设目前组件与云平台都存在一个对称加密的密匙,且组件内提供了一些API给云平台进行调用。

为什么需要防重放 :

  当云平台需要调用组件的api时,需要API鉴权。鉴权方案大概为 : 

  云平台 :

  1)  云平台生成一个随机数,将随机数与api参数一起进行哈希然后利用秘钥进行加密(类似于签名)生成一个code,然后将随机数,api参数和code发送给客户端。

  2) 经过SSL加密到达服务端

  组件 :

  1) 从SSL取得解密的数据

  2) 将随机数与api参数一起进行哈希然后利用秘钥进行加密(类似于签名)生成另一个code与收到的code进行比对。

  问题 : 虽然上述方案看起来很严谨,又是哈希又是加密还有SSL保护,但仍然存在漏洞。

  例如 : 攻击方不一定需要知道你的秘钥是什么,他只需要将你的包再次发送给客户端,他就可以获取到api的返回结果。

  如若是获取root用户当前密码或者重置root用户当前密码的api。那么可能直接对方就获取到了root权限。

防重放方案v1 : 

  方案 : 

  其实很简单,在服务器端存储一个随机数集,每个随机数只能使用一次,组件在1,2步骤中加一个步骤 : 查询随机数是否处于随机数集中,如若存在,返回重复随机数错误,如若不存在将其则加入随机数集。

  为什么方案有效 :

  由于会进行签名检验,故而如若你抓到包,然后更改为一个未曾使用过的随机数 + api参数 + code,即使api参数不变,code也不可能与随机数 + api参数的签名结果相同。

  新的问题 :

  由于有些api可能是间隔时间访问,例如 : 获取组件的运行状态。

  如若不清除随机数集 那么势必会导致 随机数 不够用,由于查询 随机数 时间过长导致api访问失败。甚至 磁盘被写满(假设随机数足够长)。

防重放方案v2 :

  方案 :

  随机数集中的随机数具有有效期,且定期清除。

  避免的问题 :

  定期清除避免v1的几乎所有问题,如若设置一个月甚至半年的有效期,也不存在太大的安全隐患(一般没人留着包等半年后去攻击你,但不排除这种可能性)。

  问题 :

  查询时间长,占用磁盘的旧问题并未完全解决,如若遇到高频率访问的api完全有可能重现这些问题。

  新问题 : 有效期后的重放攻击无法避免。

防重放方案v3 :

  云平台 :

  1)  云平台生成一个随机数 rand,记录当前时间time ,将rand + time + api参数一起进行哈希然后利用秘钥进行加密(类似于签名)生成一个code,然后rand + time + api参数 + code发送给客户端。

  2) 经过SSL加密到达服务端

  组件 :

  1) 从SSL取得解密的数据

  2) 检测 time 与服务端当前时间是否超过 2 * TTL。

  3) 将rand + time + api参数一起进行哈希然后利用秘钥进行加密(类似于签名)生成另一个code与收到的code进行比对。

  4) 遍历检测当前随机数集是否存在超出有效期(2*TTL)的随机数,如若有则删除。

  3) 遍历检测当前随机数集是否存在rand。

  4) 将rand和time写入随机数集。

  5) 提供服务并返回结果。

  原理 : 

  1) 利用签名保证了 time 和 rand 的可靠性。

  2) 利用 time 排除了time < server_time 和 time > server_time + 2*TTL 的包。

  3) 利用 具有有效期的随机数集 保证了 在 server_time  <= time <= server_time + 2*TTL 内的包 rand 不重复。

  优势 : 

  维护的 具有有效期的随机数集 小,所以不会因为鉴权导致更高的时间与空间上的过度浪费,安全。

这篇关于防重放的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/229925

相关文章

AOP自定义注解防重

Spring Boot 防重提交注解实现与实战示例 在Web开发中,防止用户重复提交表单是一个常见的需求。本文将详细介绍如何在Spring Boot中通过自定义注解和AOP技术实现防重提交功能,并提供一个完整的示例。  一、背景介绍 重复提交问题通常出现在用户在短时间内多次点击提交按钮的场景,比如在提交表单或进行支付操作时。这种情况可能会导致数据错误或产生额外的费用。为了解决这个问题,我们

面试官:你讲下接口防重放如何处理?

前言 我们的API接口都是提供给第三方服务/客户端调用,所有请求地址以及请求参数都是暴露给用户的。 我们每次请求一个HTTP请求,用户都可以通过F12,或者抓包工具fd看到请求的URL链接,然后copy出来。这样是非常不安全的,有人可能会恶意的刷我们的接口,那这时该怎么办呢?防重放攻击就出来了。 什么是防重放攻击 我们以掘金文章点赞为例。当我点赞之后,H5会发送一个请求给到掘金

Spring自定义注解防重提交方案(参数形式Token令牌)

防重提交通常在需要防止用户重复提交表单或执行某些敏感操作时使用,以确保系统的数据一致性和安全性,本文章集结了通用场景下防重提交(参数形式&Token令牌),采用Java的特性(注解和AOP),配合Redis进行实现,使用方便有效。 注解介绍及使用 什么是注解         自JDK 1.5起,Java引入了对元数据(MetaData)的支持,即注解(Annotation)。

93. 通用防重幂等设计

文章目录 一、防重与幂等的区别二、幂等性的应用场景三、幂等性与防重关系四、处理流程 一、防重与幂等的区别 防重与幂等是在 Web 应用程序和分布式系统中重要而又非常常见的问题。 防重 防重是指在多次提交同样的请求过程中,系统会检测和消除重复的数据,确保相同的数据只会被处理一次,从而避免不必要的重复操作或产生错误的结果。防重通常指人为多次提交请求、系统超时等原因数据重复处理,防止

长安链ChainMaker 交易池交易防重优化

我们将用三篇文章阐述长安链在提升交易防重能力方面所做的工作,本篇为第一篇。 全部三篇主要包括以下内容: 1. 长安链交易池及防重交易优化; 2. 布谷鸟过滤器如何提升校验效率; 3. bigfilter全局交易防重组件的介绍与应用。 一、交易池简介 在区块链中,交易池负责接收、校验、转发和缓存节点收到的待处理交易,并在共识提案时为核心引擎模块提供一批有效的交易进行区块构造 。总体来说,交

通用防重幂等如何设计?

防重与幂等的区别 防重与幂等是在 Web 应用程序和分布式系统中重要而又非常常见的问题。 防重 防重是指在多次提交同样的请求过程中,系统会检测和消除重复的数据,确保相同的数据只会被处理一次,从而避免不必要的重复操作或产生错误的结果。防重通常指人为多次提交请求、系统超时等原因数据重复处理,防止重复处理产生错误。 幂等 幂等是指对同一操作进行多次执行所产生的结果和执行一次的结果是相同的。换句

灵魂四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?

点击上方“码农突围”,马上关注 这里是码农充电第一站,回复“666”,获取一份专属大礼包真爱,请设置“星标”或点个“在看” 来源:cnblogs.com/jurendage/p/12653865.html 说明:在实际的业务中,难免会跟第三方系统进行数据的交互与传递,那么如何保证数据在传输过程中的安全呢(防窃取)?除了https的协议之外,能不能加上通用的一套算法以及规范来保证传输的安全

安全兜底:涉及钱时短信必须考虑防刷、限量和防重

开放平台资源的使用需要考虑防刷 短信验证码服务属于开放性服务,由用户侧触发,且因为是注册验证码所以不需要登录就可以使用,很容易被短信轰炸平台利用 @GetMapping("wrong")public void wrong() {sendSMSCaptcha("13600000000");}private void sendSMSCaptcha(String mobile) {//调用短信通

API防重放机制

2017-03-20 18:19 by 轩脉刃, 1995 阅读, 8 评论, 收藏, 编辑 说说API的防重放机制 我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击。重放攻击是什么呢?就是把你的请求原封不动地再发送一次,两次...n次,一般正常的请求都会通过验证进入到正常逻辑中,如果这个正常逻辑是插入数据库操作,那么一旦插入数据库的语句写的不好,就有可能出现多条重复的数据。一旦是

springweb flux拦截请求获取参数和方法做接口签名防重放校验

在给spring webflux做接口签名、防重放的时候,往往需要获取请求参数,请求方法等,而spring webflux无法像spring mvc那样好获取,这里根据之前的实践特地说明一下: 总体思路: 1、利用过滤器,从原request中获取到信息后,缓存在一个上下文对象中,然后构造新的request,传入后面的过滤器。因为原request流式的,用过一次后便无法再取参数了。 2、通过exc