重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程。

首先要明确一个事情,重放攻击是二次请求,黑客通过抓包获取到了请求的HTTP报文,然后黑客自己编写了一个类似的HTTP请求,发送给服务器。也就是说服务器处理了两个请求,先处理了正常的HTTP请求,然后又处理了黑客发送的篡改过的HTTP请求。

基于timestamp的方案
每次HTTP请求,都需要加上timestamp参数,然后把timestamp和其他参数一起进行数字签名。因为一次正常的HTTP请求,从发出到达服务器一般都不会超过60s,所以服务器收到HTTP请求之后,首先判断时间戳参数与当前时间相比较,是否超过了60s,如果超过了则认为是非法的请求。

假如黑客通过抓包得到了我们的请求url:
http://koastal.site/index/Info?uid=ZX07&stime=1480862753&sign=80b886d71449cb33355d017893720666
其中

sign=md5(sign=md5(sign=md5(uid.token.token.token.stime);// 服务器通过uid从数据库中可读出token
一般情况下,黑客从抓包重放请求耗时远远超过了60s,所以此时请求中的stime参数已经失效了。
如果黑客修改stime参数为当前的时间戳,则sign参数对应的数字签名就会失效,因为黑客不知道token值,没有办法生成新的数字签名。

但这种方式的漏洞也是显而易见的,如果在60s之内进行重放攻击,那就没办法了,所以这种方式不能保证请求仅一次有效。

基于nonce的方案
nonce的意思是仅一次有效的随机字符串,要求每次请求时,该参数要保证不同,所以该参数一般与时间戳有关,我们这里为了方便起见,直接使用时间戳的16进制,实际使用时可以加上客户端的ip地址,mac地址等信息做个哈希之后,作为nonce参数。
我们将每次请求的nonce参数存储到一个“集合”中,可以json格式存储到数据库或缓存中。
每次处理HTTP请求时,首先判断该请求的nonce参数是否在该“集合”中,如果存在则认为是非法请求。

假如黑客通过抓包得到了我们的请求url:
http://koastal.site/index/Info?uid=ZX07&nonce=58442c21&sign=80b886d71449cb33355d017893720666

其中

sign=md5(sign=md5(sign=md5(uid.token.token.token.nonce);// 服务器通过uid从数据库中可读出token
nonce参数在首次请求时,已经被存储到了服务器上的“集合”中,再次发送请求会被识别并拒绝。
nonce参数作为数字签名的一部分,是无法篡改的,因为黑客不清楚token,所以不能生成新的sign。

这种方式也有很大的问题,那就是存储nonce参数的“集合”会越来越大,验证nonce是否存在“集合”中的耗时会越来越长。我们不能让nonce“集合”无限大,所以需要定期清理该“集合”,但是一旦该“集合”被清理,我们就无法验证被清理了的nonce参数了。也就是说,假设该“集合”平均1天清理一次的话,我们抓取到的该url,虽然当时无法进行重放攻击,但是我们还是可以每隔一天进行一次重放攻击的。而且存储24小时内,所有请求的“nonce”参数,也是一笔不小的开销。

基于timestamp和nonce的方案(重要的一点, 客户端要与服务端时间一致)
那我们如果同时使用timestamp和nonce参数呢?
nonce的一次性可以解决timestamp参数60s的问题,timestamp可以解决nonce参数“集合”越来越大的问题。

我们在timestamp方案的基础上,加上nonce参数,因为timstamp参数对于超过60s的请求,都认为非法请求,所以我们只需要存储60s的nonce参数的“集合”即可。

假如黑客通过抓包得到了我们的请求url:
http://koastal.site/index/Info?uid=ZX07&stime=1480862753&nonce=58442c21&sign=80b886d71449cb33355d017893720666

其中

sign=md5(sign=md5(sign=md5(uid.token.token.token.stime.$nonce);// 服务器通过uid从数据库中可读出token
如果在60s内,重放该HTTP请求,因为nonce参数已经在首次请求的时候被记录在服务器的nonce参数“集合”中,所以会被判断为非法请求。超过60s之后,stime参数就会失效,此时因为黑客不清楚token的值,所以无法重新生成签名。

综上,我们认为一次正常的HTTP请求发送不会超过60s,在60s之内的重放攻击可以由nonce参数保证,超过60s的重放攻击可以由stime参数保证。

因为nonce参数只会在60s之内起作用,所以只需要保存60s之内的nonce参数即可。

我们并不一定要每个60s去清理该nonce参数的集合,只需要在新的nonce到来时,判断nonce集合最后一次修改时间,超过60s的话,就清空该集合,存放新的nonce参数集合。其实nonce参数集合可以存放的时间更久一些,但是最少是60s。

验证流程

//判断stime参数是否有效
if( $now - $stime > 60){
die(“请求超时”);
}

//判断nonce参数是否在“集合”已存在
if( in_array(nonce,nonce,nonce,nonceArray) ){
die(“请求仅一次有效”);
}

//验证数字签名
if ( sign!=md5(sign != md5(sign!=md5(uid.token.token.token.stime.$nonce) ){
die(“数字签名验证失败”);
}

//判断是否需要清理nonce集合
if( $now - $nonceArray->lastModifyTime > 60 ){
$nonceArray = null;
}

//记录本次请求的nonce参数
nonceArray.push(nonceArray.push(nonceArray.push(nonce);

//开始处理合法的请求

timestamp 与 nonce 防止重放攻击相关推荐

  1. 基于timestamp和nonce的防止重放攻击方案

    以前总是通过timestamp来防止重放攻击,但是这样并不能保证每次请求都是一次性的.今天看到了一篇文章介绍的通过nonce(Number used once)来保证一次有效,感觉两者结合一下,就能达 ...

  2. php 获取signature,PHP开发微信无法获取到signature,timestamp,nonce

    namespace HomeController; use ThinkController; define("TOKEN","weixin"); /* *微信的 ...

  3. API设计中防重放攻击

    HTTPS数据加密是否可以防止重放攻击? 否,加密可以有效防止明文数据被监听,但是却防止不了重放攻击. 防重放机制 我们在设计接口的时候,最怕一个接口被用户截取用于重放攻击.重放攻击是什么呢?就是把你 ...

  4. 电商系统中API接口防止参数篡改和重放攻击(小程序/APP)

    说明:目前所有的系统架构都是采用前后端分离的系统架构,那么就不可能避免的需要服务对外提供API,那么如何保证对外的API的安全呢? 即生鲜电商中API接口防止参数篡改和重放攻击 目录 1. 什么是AP ...

  5. (转)API接口防止参数篡改和重放攻击

    API重放攻击(Replay Attacks)又称重播攻击.回放攻击.他的原理就是把之前窃听到的数据原封不动的重新发送给接收方.HTTPS并不能防止这种攻击,虽然传输的数据是经过加密的,窃听者无法得到 ...

  6. API接口防止参数被篡改和重放攻击

    1. 什么是API参数篡改? 说明:API参数篡改就是恶意人通过抓包的方式获取到请求的接口的参数,通过修改相关的参数,达到欺骗服务器的目的,常用的防止篡改的方式是用签名以及加密的方式.关注公众号码猿技 ...

  7. Cryptographic nonce

    Auth2 里的 Authorization Code 模式就是使用的此方案: 参考 Cryptographic nonce 基于timestamp和nonce的防重放攻击 nonce和timesta ...

  8. 【API 接口设计】重放攻击

    原文:https://www.lanshiqin.com/ef4382ec/ 写了这么多接口,是否考虑过 api 接口安全问题呢? API重放攻击(Replay Attacks)又称重播攻击.回放攻击 ...

  9. session 重放攻击_API接口如何防止参数被篡改和重放攻击?

    说明:目前所有的系统架构都是采用前后端分离的系统架构,那么就不可能避免的需要服务对外提供API,那么如何保证对外的API的安全呢? 即生鲜电商中API接口防止参数篡改和重放攻击 目录 1. 什么是AP ...

  10. UTXO 与账户余额模型

    UTXO 与账户余额模型 从写上一篇介绍区块链共识算法的文章 分布式一致性与共识算法 到现在已经过去了三个多月的时间:虽然整个行业内有非常多的变化,但是区块链技术,尤其是底层技术却没有太多的改变.这篇 ...

最新文章

  1. kwargs.pop是什么意思
  2. NET CLR via c# 第4版笔记 第19章 可空值类型
  3. 使用python移动飞信模块发送短信
  4. sublime使用正则匹配
  5. python布尔类型运算_9.python的布尔类型与流程控制
  6. 视差滚动的爱情故事之优化篇
  7. xampp配置时几个重要的目录
  8. java 单选按钮怎么重置_单选框-复选框重置的方法
  9. python入门24 json模块
  10. ASP.NET MVC实现网站验证码功能
  11. 一些又用的国内著名期刊
  12. python语音通话_如何优雅的用Python玩转语音聊天机器人
  13. UOS主动安全防护计划(UAPP)正式发布,共建信创基础软件平台安全底座
  14. 猜拳小游戏编程(python)
  15. mysql购买服务_云数据库MySQL购买须知
  16. 堆排序、归并排序、快速排序
  17. QIIME2使用方法
  18. 本质安全电路一些参考文献
  19. GD32F150x之System Tick
  20. HtmlUnit抓取Ajax网页,例子是去哪儿机票

热门文章

  1. 安装Office时提示error 1706错误解决办法
  2. 平方根函数sqrt和牛顿迭代法
  3. matlab 求留数,基于MATLAB的留数计算方法的探讨
  4. MPS柔性生产线加工实训系统QY-JDYT34
  5. 电脑ps计算机磨皮,ps脸部磨皮教程
  6. 当直播带货回归商品销售本质?
  7. 如何从shutterstock下载无水印图片
  8. mysql win10 USB网卡_win10系统更新后usb网卡不能正常工作的解决方法
  9. 全球及中国钢铁行业供需格局与未来前景分析报告2022版
  10. 2021包膜机十大品牌排行榜