asp.net mvc webapi 实用的接口加密方法

 

在很多项目中,因为webapi是对外开放的,这个时候,我们就要得考虑接口交换数据的安全性。

安全机制也比较多,如andriod与webapi 交换数据的时候,可以走双向证书方法,但是开发成本比较大,

今天我们不打算介绍这方面的知识,我们说说一个较简单也较常见的安全交换机制

在这里要提醒读者,目前所有的加密机制都不是绝对的安全!

我们的目标是,任何用户或者软件获取到我们的webapi接口url后用来再次访问该地址都是无效的!

达到这种目标的话,我们必须要在url中增加一个时间戳,但是仅仅如此还是不够,用户可以修改我们的时间戳!

因此我们可以对时间戳 进行MD5加密,但是这样依然不够,用户可以直接对我们的时间戳md5的哦,因些需要引入一个绝对安全

双方约定的key,并同时加入其它参数进行混淆!

注意:这个key要在app里和我们的webapi里各保存相同的一份!

于是我们约定公式: 加密结果=md5(时间戳+随机数+key+post或者get的参数)

下面我们开始通过上述公式写代码:

于由我的环境是asp.net mvc 的,所以重写一个加密类ApiSecurityFilter

1、获取参数

  1. if (request.Headers.Contains("timestamp"))
  2. timestamp = HttpUtility.UrlDecode(request.Headers.GetValues("timestamp").FirstOrDefault());
  3.  
  4. if (request.Headers.Contains("nonce"))
  5. nonce = HttpUtility.UrlDecode(request.Headers.GetValues("nonce").FirstOrDefault());
  6.  
  7. if (request.Headers.Contains("signature"))
  8. signature = HttpUtility.UrlDecode(request.Headers.GetValues("signature").FirstOrDefault());
  9.  
  10. if (string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(nonce) || string.IsNullOrEmpty(signature))
  11. throw new SecurityException();

2、判断时间戳是否超过指定时间

  1. double ts = 0;
  2. bool timespanvalidate = double.TryParse(timestamp, out ts);
  3.  
  4. bool falg = (DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0)).TotalMilliseconds - ts > 60 * 1000;
  5.  
  6. if (falg || (!timespanvalidate))
  7. throw new SecurityException();

3、POST/DELETE/UPDATE 三种方式提取参数

  1. case "POST":
  2. case "PUT":
  3. case "DELETE":
  4.  
  5. Stream stream = HttpContext.Current.Request.InputStream;
  6. StreamReader streamReader = new StreamReader(stream);
  7. sortedParams = new SortedDictionary<string, string>(new JsonSerializer().Deserialize<Dictionary<string, string>>(new JsonTextReader(streamReader)));
  8.  
  9. break;

4、GET 方式提取参数

  1. case "GET":
  2.  
  3. IDictionary<string, string> parameters = new Dictionary<string, string>();
  4.  
  5. foreach (string key in HttpContext.Current.Request.QueryString)
  6. {
  7. if (!string.IsNullOrEmpty(key))
  8. {
  9. parameters.Add(key, HttpContext.Current.Request.QueryString[key]);
  10. }
  11. }
  12.  
  13. sortedParams = new SortedDictionary<string, string>(parameters);
  14.  
  15. break;

5、排序上述参数并拼接,形成我们要参与md5的约定公式中的第四个参数

  1. StringBuilder query = new StringBuilder();
  2.  
  3. if (sortedParams != null)
  4. {
  5. foreach (var sort in sortedParams.OrderBy(k => k.Key))
  6. {
  7. if (!string.IsNullOrEmpty(sort.Key))
  8. {
  9. query.Append(sort.Key).Append(sort.Value);
  10. }
  11. }
  12.  
  13. data = query.ToString().Replace(" ", "");
  14. }

6、开始约定公式计算结果并对比传过的结果是否一致

  1. var md5Staff = Seedwork.Utils.CharHelper.MD5(string.Concat(timestamp + nonce + staffId + data), 32);
  2.  
  3. if (!md5Staff.Equals(signature))
  4. throw new SecurityException();

完整的代码如下:

  1. 1 public class ApiSecurityFilter : ActionFilterAttribute
  2. 2 {
  3. 3 public override void OnActionExecuting(HttpActionContext actionContext)
  4. 4 {
  5. 5 var request = actionContext.Request;
  6. 6
  7. 7 var method = request.Method.Method;
  8. 8 var staffId = "^***********************************$";
  9. 9
  10. 10 string timestamp = string.Empty, nonce = string.Empty, signature = string.Empty;
  11. 11
  12. 12 if (request.Headers.Contains("timestamp"))
  13. 13 timestamp = request.Headers.GetValues("timestamp").FirstOrDefault();
  14. 14
  15. 15 if (request.Headers.Contains("nonce"))
  16. 16 nonce = request.Headers.GetValues("nonce").FirstOrDefault();
  17. 17
  18. 18 if (request.Headers.Contains("signature"))
  19. 19 signature = request.Headers.GetValues("signature").FirstOrDefault();
  20. 20
  21. 21 if (string.IsNullOrEmpty(timestamp) || string.IsNullOrEmpty(nonce) || string.IsNullOrEmpty(signature))
  22. 22 throw new SecurityException();
  23. 23
  24. 24 double ts = 0;

net mvc webapi 实用的更多相关文章

  1. asp.net mvc webapi 实用的接口加密方法

    在很多项目中,因为webapi是对外开放的,这个时候,我们就要得考虑接口交换数据的安全性. 安全机制也比较多,如andriod与webapi 交换数据的时候,可以走双向证书方法,但是开发成本比较大, ...

  2. asp.net mvc webapi 实用的接口加密方法(转载)

    在很多项目中,因为webapi是对外开放的,这个时候,我们就要得考虑接口交换数据的安全性. 安全机制也比较多,如andriod与webapi 交换数据的时候,可以走双向证书方法,但是开发成本比较大, ...

  3. ASP.NET Core MVC/WebAPi 模型绑定探索

    前言 相信一直关注我的园友都知道,我写的博文都没有特别枯燥理论性的东西,主要是当每开启一门新的技术之旅时,刚开始就直接去看底层实现原理,第一会感觉索然无味,第二也不明白到底为何要这样做,所以只有当你用 ...

  4. mvc+webapi 单元测试

    1.前言 现在这个项目已经有阶段性的模块完成了,所以就想着对这些模块进行单元测试,以保证项目的代码的质量.首先虽然标题是mvc+webapi实质上我只是对mvc进行的测试.用的时候vs的unit te ...

  5. 让Asp.net mvc WebAPI 支持OData协议进行分页查询操作

    这是我在用Asp.net mvc WebAPI 支持 OData协议 做分页查询服务时的 个人拙笔. 代码已经开发到oschina上.有兴趣的朋友可以看看,欢迎大家指出不足之处. 看过了园子里的几篇关 ...

  6. MVC WebAPI 三层分布式框架开发

    版权声明:本文为博主原创文章,未经博主允许不得转载. 前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理 ...

  7. 启用 mvc webapi 的 session功能可用

    默认 mvc webapi 不开启 session 会话支持 所以需要修改配置,在 Global 开启 session 支持 如下: 1.重写 init() 方法 public override vo ...

  8. .net和java和谐相处之安卓客户端+.net asp.net mvc webapi 2

    作为没有花很多时间转java,把java当C#用的我,在做服务器端程序的时候,自然不想考虑java web,java需要学的框架太多了,看了一下Java Servlet,始终没有编码的冲动.经过几天的 ...

  9. 转载CSDN (MVC WebAPI 三层分布式框架开发)

    前言:SOA(面向服务的架构)是目前企业应用开发过程中普遍采用的技术,基于MVC WebAPI三层分布式框架开发,以此适用于企业信息系统的业务处理,是本文论述的重点.此外,插件技术的应用,富客户端JQ ...

随机推荐

  1. Magical Girl Haze 南京网络赛2018

    题意: 就是使不大于k条路的权值变为零后求最短路 解析: d[i][j]表示使j条路变为权值后从起点到点i的最短路径 这题不能用spfa做  tle #include <iostream> ...

  2. 奔小康赚大钱 HDU - 2255(最大权值匹配 KM板题)

    奔小康赚大钱 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  3. 【Revit API】改变填充区域的填充样式

    话不多说,直接上代码 var target = pattern.Target; var name = pattern.Name; var fpElem = FillPatternElement.Get ...

  4. 【转】crc16几种标准校验算法及c语言代码

    一.CRC16校验码的使用 现选择最常用的CRC-16校验,说明它的使用方法. 根据Modbus协议,常规485通讯的信息发送形式如下: 地址 功能码 数据信息 校验码 1byte 1byte nby ...

  5. NOI Linux的安装说明以及使用指南

    安装 本人的安装环境为Win10. 1. 首先从官网上下载一个CCF官方提供的Noi linux虚拟机以及安装文档 传送门 2. 然后,安装一个VMware Workstation 14 Pro,这里 ...

  6. JavaScript--Dom间接选择器

    一.Dom间接选择器 间接查找的属性 parentNode // 父节点 childNodes // 所有子节点 firstChild // 第一个子节点 lastChild // 最后一个子节点 n ...

  7. OpenStack 云主机深入了解(十四)

    云主机深入了解 1.云主机在计算节点以进程方式运行 2.监听vnc的端口,vnc默认端口从5900开始, 多台云主机,端口递增 3.云主机桥接网卡,与宿主机联通网络 提示:在openstack环境下, ...

  8. SQL语句(十二)分组查询

    (十二)分组查询 将数据表中的数据按某种条件分成组,按组显示统计信息 查询各班学生的最大年龄.最小年龄.平均年龄和人数 分组 SELECT <字段名表1> FROM <表名> ...

  9. python学习笔记7-网络编程

    import urllib.request import json,requests #urlib模块,不常用 url = 'http://api.nnzhp.cn/api/user/stu_info ...

  10. artTemplate

    1.http://www.cnblogs.com/jiqiyoudu/p/4588042.html