防重放攻击实现

简介: 防重放攻击实现

本文为博主原创,未经允许不得转载

1.防重放攻击:请求被攻击者获取,并重新发送给认证服务器,从而达到认证通过的目的。

2。解决方案:

 a. 基于timestamp防止重放攻击

       每次 http 请求时,都添加 timestamp 时间戳的参数,服务端接收到请求时,解析 timestamp 值,并与当前时间进行比较,判断是否超过60s,

  如果超过60s 则丢弃该请求。

 b. 基于nonce值得防重放攻击

    每次http请求时,都添加 一个固定长度的随机数或请求ip加随机数进行hash生成的字符串,服务端在接受到请求的时候,解析请求的nonce值,并将nonce值存于数据库或缓存中,

  当请求时,判断数据库或缓存中是否存在该nonce值,如果存在则丢弃该请求。 此时,使用nonce值,在 http 请求时,nonce值可以保证请求的唯一性。

 c .基于timstamp和nonce值防止重放攻击

      单纯基于 timestamp 进行防重放攻击也会存在风险,如果请求被中间人或是黑客获取,且请求的时间戳与当前时间比较时,仍小于60s 时,此时则

  不能进行防重放攻击。

    单纯使用nonce值时,需要服务端不断地保存nonce值,则会导致数据库保存大量的nonce值,影响效率。

    基于以上两种情况,则将两者结合一起使用,nonce值可以保证请求的唯一性,timestamp可以保证请求的时效性。并将保存于数据库或缓存中的nonce值,

  每隔60s清除一次或将缓存中的nonce值时效时间设置为60s。这样就可以减少nonce值对数据库的压力,提高性能。

 

3. 使用证书(公钥与私钥),timestamp 与nonce值进行防重放与防篡改  

  以上请求中nonce值或时间戳等值,若都使用明文传输,会存在被中间人或黑客截取,再次发起请求的风险。

  很多需要进行防重放攻击的场景则都需要保证很高的安全性,所以在整个过程中,可以使用证书进行数据签名,保证请求不被篡改。

  使用证书的公钥与私钥保证请求参数以及timestamp与nonce值不被篡改的方案有两种:

    第一种方案:(客户端使用公钥对数据加密,服务端私钥解密,校验数据的有效性)

      1.客户端向服务端发起https请求

      2.服务端接受到请求后,生成公钥和私钥,公钥相当于锁,私钥相当于钥匙,只有私钥才能打开公钥的内容

      3.服务端返回客户端公钥。

      4.客户端接受到公钥,并解析公钥的有效性,比如颁发者,到期时间等,如果解析异常,则提示证书错误,并进行证书更新。

        客户端解析公钥ok后,对请求体进行加密(此时可将timestamp与nonce值在请求体中进行传输),并传输给服务端

      5.服务端解析客户端传过来的数据,并进行解析,并找到保存于服务端的私钥,对该请求体进行解密,并解析出timestamp 与

        nonce值,此时判断两个值得有效性,如果在使用服务端私钥进行解密处理异常时,则提示请求非法。


    第二种方案:(客户端使用私钥签名,服务端使用公钥验签,校验数据的有效性)

      1.客户端向服务端发起https请求

      2.服务端接受到请求后,生成公钥和私钥,公钥相当于锁,私钥相当于钥匙,只有私钥才能打开公钥的内容

      3.服务端返回客户端私钥

      4.客户端使用私钥对请求进行签名(签名的格式可以将HTTP请求头与请求体按按照一定格式进行签名:String signStr = header+&+body),

        并使用authorition 字段以请求头的方式,将签名的数据传到服务端

      5.服务端解析对应的请求,解析出请求头与请求body,拼接签名的原始格式:String signStr = header+&+body,服务端并解析出该请求私钥

        对应的公钥。用公钥验签,判断数据是否被篡改,验签通过后,解析出nonce 值与timestamp值,进行防重放的校验


  使用公钥验签与私钥解密的方式可以参考这篇文章:

     RSA 加密,解密,签名,验签

  

 

标签: 高并发

相关文章
|
Java API Maven
敏感数据的保护伞——SpringBoot Jasypt加密库的使用
我们经常会在yml配置文件中存放一些敏感数据,比如数据库的用户名、密码,第三方应用的秘钥等等。这些信息直接以明文形式展示在文件中,无疑是存在较大的安全隐患的,所以今天这篇文章,我会借助jasypt实现yml文件中敏感信息的加密处理。
6326 1
敏感数据的保护伞——SpringBoot Jasypt加密库的使用
|
存储 算法 定位技术
每个系统都在用的appid、appkey、appsecret都是什么意思?
每个系统都在用的appid、appkey、appsecret都是什么意思?
14732 0
|
安全 NoSQL Java
SpringBoot接口安全:限流、重放攻击、签名机制分析
本文介绍如何在Spring Boot中实现API安全机制,涵盖签名验证、防重放攻击和限流三大核心。通过自定义注解与拦截器,结合Redis,构建轻量级、可扩展的安全防护方案,适用于B2B接口与系统集成。
1413 3
|
6月前
|
存储 JSON 安全
接口安全:签名、加密、防重放架构方案
本文详解接口安全三大核心防线:签名(防篡改/伪造)、加密(防窃听/泄露)、防重放(防复用攻击)。厘清三者边界与协同逻辑,提供生产级规范、主流算法选型及完整Java代码实现,助开发者构建真正安全的全链路接口防护体系。
1051 2
|
存储 安全 API
如何下载旧版本的 Postman?
旧版本的 Postman 可能有助于更好地兼容不同的框架。 了解如何找到 Postman 的确切版本,以便优化你的 API 开发!
如何下载旧版本的 Postman?
|
安全 前端开发 Java
SpringBoot接口设计防篡改和防重放攻击
本文介绍了API接口的安全问题及解决方案,包括防止接口参数被篡改和重放攻击的方法。主要措施有:使用HTTPS传输、参数加密、时间戳签名验证等。并通过创建过滤器对请求参数进行签名验证,确保接口的安全性。
1847 10
|
缓存 编解码 算法
Netty源码—6.ByteBuf原理一
本文深入探讨了Netty中ByteBuf的使用与内存管理机制。主要内容包括ByteBuf的问题整理、结构及重要API、ByteBuf的分类及其补充说明。此外,还详细分析了内存分配器ByteBufAllocator的功能,包括其两大子类UnpooledByteBufAllocator和PooledByteBufAllocator的实现原理,尤其是PooledByteBufAllocator通过PoolArena进行内存分配的具体流程。最后,总结了ByteBuf的主要内容分为内存抽象、分配策略和回收过程三大方面,为高效使用ByteBuf提供了理论基础。
|
JavaScript 前端开发 数据安全/隐私保护
Vue如何实现权限管理(动态路由addRoutes)
Vue如何实现权限管理(动态路由addRoutes)
1245 1
|
安全 Java 测试技术
如何在 Spring Boot 中禁用 Actuator 端点安全?
如何在 Spring Boot 中禁用 Actuator 端点安全?
3828 1
|
安全 NoSQL 网络协议
SSRF内网打穿相关姿势
本文详细介绍了服务器端请求伪造(SSRF)漏洞,包括其定义、漏洞场景、常见漏洞函数、URL伪协议及其利用方法。通过具体的靶机示例,展示了如何利用SSRF漏洞进行内网探测、命令执行、SQL注入、命令注入、XXE注入、Tomcat任意文件上传和Redis未授权访问等攻击。文章还提供了相关工具和参考资料,帮助读者更好地理解和应对SSRF漏洞。
2427 0
SSRF内网打穿相关姿势

热门文章

最新文章