HTTPS数据加密是否可以防止重放攻击?

否,加密可以有效防止明文数据被监听,但是却防止不了重放攻击。

防重放机制

我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击。重放攻击是什么呢?就是把你的请求原封不动地再发送一次,两次...n次,一般正常的请求都会通过验证进入到正常逻辑中,如果这个正常逻辑是插入数据库操作,那么一旦插入数据库的语句写的不好,就有可能出现多条重复的数据。一旦是比较慢的查询操作,就可能导致数据库堵住等情况。
付款接口,或者购买接口会造成损失
需要采用防重放的机制来做请求验证。

timestamp+nonce

我们常用的防止重放的机制是使用timestamp和nonce来做的重放机制。
timestamp用来表示请求的当前时间戳,这个时间戳当然要和服务器时间戳进行校正过的。我们预期正常请求带的timestamp参数会是不同的(预期是正常的人每秒至多只会做一个操作)。每个请求带的时间戳不能和当前时间超过一定规定的时间。比如60s。这样,这个请求即使被截取了,你也只能在60s内进行重放攻击。过期失效。
但是这样也是不够的,还有给攻击者60s的时间。所以我们就需要使用一个nonce,随机数。
nonce是由客户端根据足够随机的情况生成的,比如 md5(timestamp+rand(0, 1000)); 也可以使用UUID, 它就有一个要求,正常情况下,在短时间内(比如60s)连续生成两个相同nonce的情况几乎为0。

服务端

服务端第一次在接收到这个nonce的时候做下面行为:
1 去redis中查找是否有key为nonce:{nonce}的string
2 如果没有,则创建这个key,把这个key失效的时间和验证timestamp失效的时间一致,比如是60s。
3 如果有,说明这个key在60s内已经被使用了,那么这个请求就可以判断为重放请求。
示例
那么比如,下面这个请求:
http://a.com?uid=123&timestam...
这个请求中的uid是我们真正需要传递的有意义的参数
timestamp,nonce,sign都是为了签名和防重放使用。
timestamp是发送接口的时间,nonce是随机串,sign是对uid,timestamp,nonce(对于一些rest风格的api,我建议也把url放入sign签名)。签名的方法可以是md5({秘要}key1=val1&key2=val2&key3=val3...)
服务端接到这个请求:
1 先验证sign签名是否合理,证明请求参数没有被中途篡改
2 再验证timestamp是否过期,证明请求是在最近60s被发出的
3 最后验证nonce是否已经有了,证明这个请求不是60s内的重放请求

web层面也可以采用在页面中加入token方式,手机验证码,滑动验证码等方式来防止攻击

API设计中防重放攻击相关推荐

  1. 让你在 API 设计中少踩坑的实战分享

    本文来自作者 奔跑吧架构师 在 GitChat 上分享 「让你在 API 设计中少踩坑的实战分享」,「阅读原文」查看交流实录. 「文末高能」 编辑 | 哈比 在项目开发中,实际的编码只占用了整个项目不 ...

  2. API设计中时间定义的5条规则

    API设计中,如何定义你的时间参数和时间相关的返回值可能会是一个潜在的问题,千万不要低估这些问题,它们可能会对你未来的设计和实现造成很大麻烦. 本文提供一些tips可能可以帮助到大家 规则#1  使用 ...

  3. API设计中性能提升的10个建议

    [引子]节前的时候, 一好友约我聊一聊API 的设计.当时觉得仿佛有万语千言,但我又难以脱口而出1.2.3.原来,即便是工作的日常,也缺乏一个系统性的思考和整理.API的设计涉及到的方面很多, 分类是 ...

  4. DeepL Api 设计中的欺骗战术

    安全不仅仅是一门朴素的学问,更是一门权衡的艺术.有时一个简单的设计可以规避掉大多数攻击问题,下面分享一篇在网上看到的DeepL API的反爬设计. 这篇博文本应该在去年完成 DeepL 客户端逆向的时 ...

  5. java api 设计_Java API设计实践

    使你的API在模块化和非模块化Java环境中都可用 在优锐课的java学习分享中,对微服务有了更深层次的新概念.关于API设计实践一点就通了. 介绍 了解设计Java API时应应用的一些API设计实 ...

  6. Google API 设计指南-设计模式

    翻译自 API Design Guide - Design Patterns 空响应体 标准的 Delete 方法 必须(must) 返回 google.protobuf.Empty 来实现全局一致性 ...

  7. java开发checklist,Java API设计CheckList

    API设计原则:正确.好名.易用.易学.够快.够小.但我们从来不缺原则,〜〜〜 Interface 1.The Importance of Being Use Case Oriented,一个接口应当 ...

  8. 微服务API设计的实践与思考总结

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取后台回复"k8s",可领取k8s资料 随着微服务的越来越 ...

  9. 阿里研究员谷朴:API 设计最佳实践的思考

    2019独角兽企业重金招聘Python工程师标准>>> API是软件系统的核心,而软件系统的复杂度Complexity是大规模软件系统能否成功最重要的因素.但复杂度Complexit ...

最新文章

  1. c语言中不能表示的整型常量进制,C语言中整型常量的表示方法
  2. wincc flexable变量组态
  3. 欲从事服务端工作不懂seata?一篇小demo零基础带你快速掌握分布式事务框架seata的基本使用!
  4. 微服务架构设计模式~为应用程序定义微服务架构
  5. 计算机丢失wpcap.dll会影响什么,Win7系统提示wpcap.dll丢失如何解决?
  6. 面包板如何接线电源 图解_互感器、电能表接线和原理讲解
  7. 字节跳动面试真题:java程序设计基础教程
  8. 烂泥:nagios学习(四):pnp4nagios图形化绘制nagios数据
  9. 一篇文章搞懂BIM技术的要点和前景
  10. 树莓派3降低内核版本,安装Tenda U6 RTL8192无线网卡驱动
  11. centos系统上实现微信语音amr格式,qq语音slk格式转mp3
  12. SIM800C实验记录之通过GPRS上网
  13. Vue学习笔记02——Vue路由
  14. Electron-Vue中操作本地数据库NeDB
  15. xshell免费版安装
  16. 设置iPhone的呼叫转移来电等待
  17. 诺基亚计划于下周发布虚拟现实产品
  18. 网站添加头部Meta property=og协议的使用方法详解教程
  19. c语言稀疏矩阵_C中的稀疏矩阵
  20. 他在BAT等大厂研发10年,总结了12条开发经验给你

热门文章

  1. Manacher 求最长回文子串算法
  2. css浮动+应用(瀑布流效果的实现)
  3. redis集群安装和java应用
  4. JavaScript之三:jQuery插件开发(一)
  5. linux 管理命令 之 管理时间
  6. DeepEarth中的拖放行为(DragBehavior)
  7. [转]几句不可不看的经典人生语句
  8. POJ 1961 KMP(当前重复次数)
  9. 【五线谱】拍号与音符时值 ( 全音符 | 二分音符 | 四分音符 | 八分音符 | 十六分音符 | 三十二分音符 )
  10. 【Java 虚拟机原理】Android 类加载机制 ( 双亲委派机制 | BootClassLoader | PathClassLoader | DexClassLoader )