C# 如何防止重放攻击
重放攻击
重放攻击是指黑客通过抓包的方式,得到客户端的请求数据及请求连接,重复的向服务器发送请求的行为。 比如你有一个 “购买” 的操作,当你点击购买按钮时,向服务器发送购买的请求。而这时黑客对你的请求进行了抓包,得到了你的传输数据。 因为你填写的都是真实有效的数据,是可以购买成功的,因此他不用做任何改变,直接把你的数据再往服务器提交一次就行了。这就导致了,你可能只想购买一个产品的,结果黑客重放攻击,你就购买了多次。如果是用户操作的话,肯定就会莫名奇妙:怎么购买了那么多同样的产品,我只买了一个啊? 所以,重放攻击的危害还是挺大的,特别是涉及到金钱交易时,因此防重放攻击在电商项目中是必不可少的。
解决方案
时间戳(tamp) + 数字签名(sign)。 也就是说每次发送请求时多传两个参数,分别为 tamp 和 sign。比如
原先请求为 http://127.0.0.1/api/buyproduct
修改之后为 http://127.0.0.1/api/buyproduct?tamp=1403149835&sign=945bf36r046bd84df2985ad625c9f92415eccd1w
数字签名的作用是为了确保请求的有效性。因为签名是经过加密的,只有客户端和服务器知道加密方式及Key,所以第三方模拟不了。我们通过对sign的验证来判断请求的有效性,如果sign验证失败则判定为无效的请求,反之有效。 但是数字签名并不能阻止重放攻击,因为黑客可以抓取你的tamp和sign(不需做任何修改),然后发送请求。这个时候就要对时间戳进行验证。
时间戳的作用是为了确保请求的时效性。我们将上一次请求的时间戳进行存储,在下一次请求时,将两次时间戳进行比对。如果此次请求的时间戳和上次的相同或小于上一次的时间戳,则判定此请求为过时请求,无效。因为正常情况下,第二次请求的时间肯定是比上一次的时间大的,不可能相等或小于。
有人会问,我直接用时间戳不就行了,为什么还要数字签名?因为黑客可能对请求进行抓包,然后修改时间戳为有效的时间戳值。我们的数字签名采用 tamp+key 进行组合加密,即使黑客修改了 tamp ,但是由于黑客不知道key,所以 sign 验证这步就成功的阻止了黑客的请求。
实例代码
加密方式采用 SHA1,SHA1加密方法进行了封装,写成了string的扩展方法。
/// <summary>
/// 数字签名
/// </summary>
/// <param name="tamp">时间戳(由客户端传入)</param>
/// <param name="key">Key</param>
/// <returns></returns>
private string Sign(string tamp, string key)
{
string txt = tamp + "|" + key; //在每个参数中间加了个 "|" ,增加复杂度
string sign = txt.GetSha1();
return sign;
}
验证方法, 客户端的加密方式和服务端是一样的,如果两者的加密结果不一致,则验证失败。 如果客户端是js,一定要对js做代码混淆,禁止右键等。因为我是用Session存储上一次请求的时间戳的,而Session是会过时的,当Session过时时黑客再进行攻击,就会得手,所以限制请求有效期为30秒。
/// <summary>
/// 检查请求是否有效,防重放
/// </summary>
/// <param name="tamp">时间戳(由客户端传入)</param>
/// <param name="key">Key</param>
/// <param name="sign">验签(由客户端传入)</param>
/// <returns></returns>
private bool CheckRequest(string tamp, string key, string sign)
{
//验签(比对客户端的加密结果和服务端的加密结果,如果不相等,则验签失败)
if (sign.ToUpper() != Sign(tamp, key).ToUpper()) return false; //得到当前时间戳
DateTime DateStart = new DateTime(, , , , , );
int nowTamp = Convert.ToInt32((DateTime.Now - DateStart).TotalSeconds);
if ((nowTamp - int.Parse(tamp)) > 30) return false; //因为Session可能过时,所以限定请求有效时间为30秒
//得到上一次的时间戳
string prevTamp = Session["tamp"] as string;
//判断是否为空,为空说明是第一次请求
if (!string.IsNullOrWhiteSpace(prevTamp))
{
if (int.Parse(tamp) > int.Parse(prevTamp))
{
Session["tamp"] = tamp;
return true;
}
else
{
return false;
}
}
else
{
Session["tamp"] = tamp;
return true;
}
}
C# 如何防止重放攻击的更多相关文章
- .NET添加时间戳防止重放攻击
如过客户端在向服务端接口进行请求,如果请求信息进行了加密处理,被第三方截取到请求包,虽然第三方无法解密获取其中的数据,但是可以使用该请求包进行重复的请求操作.如果服务端不进行防重放攻击,就会参数服务器 ...
- 重放攻击(Replay Attacks)
重放攻击(Replay Attacks)1.什么是重放攻击顾名思义,重复的会话请求就是重放攻击.可能是因为用户重复发起请求,也可能是因为请求被攻击者获取,然后重新发给服务器. 2.重放攻击的危害请求被 ...
- 基于timestamp和nonce的防重放攻击
以前总是通过timestamp来防止重放攻击,但是这样并不能保证每次请求都是一次性的.今天看到了一篇文章介绍的通过nonce(Number used once)来保证一次有效,感觉两者结合一下,就能达 ...
- timestamp 与 nonce 防止重放攻击
重放攻击是计算机世界黑客常用的攻击方式之一,所谓重放攻击就是攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程. 首先要明确一个事情,重放攻击是二次请求,黑客通过抓包获取到 ...
- 细说REST API安全之防止重放攻击
一. 重放攻击概述 百科对重放攻击的描述:https://zh.wikipedia.org/wiki/%E9%87%8D%E6%94%BE%E6%94%BB%E5%87%BB简而言之,重放攻击的产生是 ...
- 在BCH硬分叉后防止重放攻击-1
导致新加密货币的硬分叉为加密交换运营商带来了独特的机遇和挑战.Poloniex在最近的Bitcoin Cash硬叉之后面临的一个挑战是保护我们的客户免受重播攻击.由于SV链后面的开发团队选择在分叉后近 ...
- 在BCH硬分叉后防止重放攻击-2
重放攻击原理和防范措施——如何安全分离BCH的分来源:巴比特018-11-18 16:49:37 热度 12390 第0章 引言 即将面临的比特币分裂,如何保证你的币在分裂后肯定留下两种币?一个重点要 ...
- 使用Arduino模块实施无线信号的重放攻击
无线电已经存在使用了很长一段时间,在这很长的一段时间里诞生了一个名叫火腿族的集体(小编:嗯 对 就是整天吃火腿的那些人^_^ CQ CQ ).无线电和互联网一样:同样存在一些安全隐患,比如:在无线信 ...
- C# 如何防止重放攻击(转载)
转载地址:http://www.cnblogs.com/similar/p/6776921.html 重放攻击 重放攻击是指黑客通过抓包的方式,得到客户端的请求数据及请求连接,重复的向服务器发送请求的 ...
随机推荐
- 将celery定时任务设置为根据本地时区触发
默认celery的时区为UTC,如果要在django项目中将celery定时任务配置为根据本地时区触发,则需要修改 在setttings.py 添加以下任意一行: # celery 相关配置 CELE ...
- POJ 2853
#include<iostream> #include<stdio.h> #include<vector> #include<math.h> #incl ...
- POJ 2606
#include<iostream> #include<set> #include<stdio.h> #include<math.h> #include ...
- vector源码1(参考STL源码--侯捷):源码
vector源码1(参考STL源码--侯捷) vector源码2(参考STL源码--侯捷) vector源码(参考STL源码--侯捷)-----空间分配导致迭代器失效 vector源码3(参考STL源 ...
- SQL Server 跨域访问
# SQL Server 跨服务器访问数据 参考链接: [sp_addlinkedserver](https://msdn.microsoft.com/zh-cn/library/ms190479.a ...
- 全网最详细的Sublime Text 3的插件官方网站(图文详解)
不多说,直接上干货! 全网最详细的Windows里下载与安装Sublime Text *(图文详解) 全网最详细的Sublime Text 3的激活(图文详解) 全网最详细的Sublime Text ...
- ubuntu 下配置elasticSearch
配置JAVA环境 配置jdk 上官网下载x64的和ubuntu匹配的jdk 找到usr/java ,解压下载的文件 tar –xzvf 文件.tar.gz Vim /etc/source 添加配 ...
- epoll 触发模式
Edge Triggered (ET):边缘触发只有数据到来,才触发,不管缓存区中是否还有数据.Level Triggered (LT):水平触发只要有数据都会触发. LT(level trigger ...
- Unity生成WebService代理类
普通的.net程序中,如果我们想引用webService,只需在项目中右键选择添加服务引用,然后在地址栏中输入Webservice地址,单击“转到”按钮,找到服务后再单击确定,Visual Studi ...
- Docker轻量级web图形页面管理 - Portainer部署记录
Docker图形页面管理工具基本常用的有三种: Docker UI,Shipyard,Portainer,之前分别介绍了Docker UI和Shipyard部署,下面简单介绍下Portainer部署. ...