API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间

在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请求都应该有原则地保障安全性。

例如这个接口  http://127.0.0.1/api/user/list?type=value 这个获取用户列表信息的请求总不能在地址栏一输入就直接显示信息(虽然有点夸张,不至于阿猫阿狗的信息这么容易get吧),在写webapi接口原则性的基本要求必须得保证数据的安全性和请求的有效性

在这里我就使用Token+参数签名+时间戳  这三个系统参数来办证请求的有效性(即时100%请求有效,也不能说100%也安全了)。

参数名 必选 类型 作用
token string 调用方标识,保障其身份是来自本系统认证过的,有效识别用户身份
sign string 接口参数的key,value的记录,防止参数值被篡改,防止伪装请求
timestamp int 时间戳,防止重放攻击

那么问题来

1.token 如何生成?作用是什么?

2.参数签名如何生成?作用是什么?

3.时间戳的作用是什么?

看了这篇文章你就知道了。这三个系统参数是如何保证请求的有效性,一定程度上提高数据的安全性

1.token如何生成的?作用是什么?

token生成:一般的api基本上主要分为两种客户端访问api的token和需要用户登录之后的token,这里我就来说一下后者,(简单通俗做法)用户登录输入用户名、密码,访问api,验证数据库成功。这个时候可以产生token,失败直接返回。问题又来了!
1.token生成的方式是什么?2.token存在哪里?3.token如何验证是否正确
在验证数据成功之后可以获取唯一用户标识(用户名也行),就以username:zhanglin为例吧,对这个标识进行加密(des,MD5、其他的也行,关键数据必须得加密),这个加密之后的字符串就可以做为一个Token了。
2.token每次请求都需要进行传递,推荐存在cookie,也可以持久化到客户端。现在有这样一个api接口http://127.0.0.1/api/user/list?token=encryptUsernameStr
这个encryptZhanglinStr就是登录成功后加密的username返回的给客户端,客户端用什么保存这里就不多介绍了,只需要知道返回给客户端一个用户访问的Token类即可,到了服务器端方法验证的时候再进行解密,获取到字符串zhanglin,然后将这个zhanglin与系统用户(可采用缓存数据库、缓存token的值)对比,如果对比存在,则说明有权限去访问api,反之非法的请求。
还是代码来实现一下吧。代码比较容易理解,就是为了把这个原理说清楚一点
  1. [Route("login")]
  2. public bool login(string account, string pwd)
  3. {
  4. var obj = Db.dbUsers.FirstOrDefault(f => f.Account == account && f.Pwd == pwd);
  5. if (obj != null)
  6. {
  7. string token = account.DESEncrypt(desKey);//加密产生token,
  8. HttpCookie cookie = new HttpCookie(cookieToken,token);
  9. HttpContext.Current.Response.Cookies.Add(cookie);//保存cookie
  10. return true;
  11. }
  12. else
  13. {
  14. return false;
  15. }
  16. }
token的产生就是登陆之后根据用户标识保存在cookie里,这样在客户端每次发送请求的时候都会带上token这个参数,如下:
  1. [Route("list"), HttpGet]
  2. public List<string> List(string  type,string token)
  3. {
  4. var obj = Db.dbUsers.FirstOrDefault(p => p.Account == token.DESDecrypt(desKey));
  5. //验证token
  6. if (obj != null)
  7. {
  8. //返回数据集
  9. }
  10. else
  11. {
  12. //非法请求
  13. }
  14. }
3.这样就可以验证token是否正确,一般都是用缓存。
Token的作用的就是判断请求是否是系统用户发出的,这样能有效识别请求用户的身份信息
2..参数签名如何生成?作用是什么?
参数签名sign:为了提高传参过程中,防止参数被恶意修改,在请求接口的时候加上sign可以有效防止参数被篡改,那么sign是如何起作用的呢?
看看它的生成方法就明白了
 
比如有这样一个接口http:127.0.0.1/api/product?&type=zl&p1=value1&p2=value2&p3=&sign=signValue
第一步:拼接参数字符串,除去sign参数本身和为空值的p3,那么剩下的就是字符串type=zl&p1=value1&p2=value2,然后按参数名字符升(降)序,得到字符串
p1=value1&p2=value2&type=zl
第二步:然后做参数名和值的拼接,得到字符串p1value1p2value2type=zl,注意编码,不能出现这种&quot; ,要转码后“后拼接
第三步:将字符串进行DES加密,假设p1value1p2value2type=zl进行des加密后的结果是abc123,最终得到的字符串abc123就是参数sign的值signValue
第四步:在接口中我们会接收到参数名sign的参数值abc123,然后解密得到字符串p1value1p2value2type=zl,再与接口中参数拼接排序后进行比较,如果不一样则说明参数的循序不一样,参数的值就一定是被修改过了。
总结:
1.接口的调用方和接口的提供方统一约定参数加密算法
2.参数签名就是对参数key ,value的一个记录。参数如果被修改肯定对不上参数签名,就不会调用请求
 
3.时间戳的作用?
在api请求的接口,客户端请求的发生时间便是时间戳,这个参数到了服务器,与服务器端时间对比,如果时间间隔较长则无效。
在asp.net mvc的开发webapi接口时,可以使用mvc的过滤器进行以上三个关键参数的拦截过滤。以下代码是在.net core中实现的,方法还是一样的,都是在进入方法前进行拦截,这是一个登录的api。
返回api结果是一个类ApiResult.cs,序列化成json对象,该类包含两个泛型方法请求成功的Ok方法,请求失败的Error方法
  1. public class MyFilterAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute
  2. {
  3. public override void OnActionExecuting(ActionExecutingContext context)
  4. {
  5. var request_param = context.ActionArguments.Values;
  6. var  queryCollection = context.HttpContext.Request.Query;
  7. string account = string.Empty;
  8. string password = string.Empty;
  9. long timespan = 0;
  10. string signature = string.Empty;
  11. try
  12. {
  13. account = queryCollection.Where(p => p.Key == "account").Select(f => f.Value).FirstOrDefault().ToString();
  14. password = queryCollection.Where(p => p.Key == "password").Select(f => f.Value).FirstOrDefault().ToString();
  15. timespan = long.Parse(queryCollection.Where(p => p.Key == "timespan").Select(f => f.Value).FirstOrDefault().ToString());
  16. signature = queryCollection.Where(p => p.Key == "signature").Select(f => f.Value).FirstOrDefault().ToString();
  17. }
  18. catch (Exception ex)
  19. {
  20. var apiresult = ApiResult<bool>.Error("参数异常"+ex.ToString());
  21. context.Result = new JsonResult(apiresult);
  22. }
  23. //var accountName = context.RouteData.Values["accountName"].ToString()
  24. var expires_minute = (timespan - DateTime.Now.Ticks) / 60000000000;
  25. if (expires_minute> 10||expires_minute<-10)
  26. {
  27. var apimodel = ApiResult<bool>.Error("请求超时"+expires_minute);
  28. //var json = JsonConvert.SerializeObject(apimodel);
  29. JsonResult ret = new JsonResult(apimodel);
  30. context.Result =ret;
  31. }
  32. var ok = ("account" + account + "password" + password).Contains(signature);//ToDO 加密解密
  33. if (ok == false)
  34. {
  35. var apimodel = ApiResult<bool>.Error("非法请求");
  36. var json = JsonConvert.SerializeObject(apimodel);
  37. JsonResult ret = new JsonResult(apimodel);
  38. context.Result = ret;
  39. }
  40. base.OnActionExecuting(context);
  41. }
  42. }

作者:张林
原文标题:webapi token、参数签名是如何生成的
原文链接:http://blog.csdn.net/kebi007/article/details/72861532

webapi token、参数签名是如何生成的(转载)的更多相关文章

  1. [置顶] webapi token、参数签名是如何生成的

    一个问题 在这里我想问大家一句,如果你向一个刚刚接触.net web后端程序开发的同学(别人刚刚也就学了webform的request,response,会提交表单的这种刚接触不久的同学),你怎么去解 ...

  2. WebApi安全性 参数签名校验(结合Axios使用)

    接口参数签名校验,是WebApi接口服务最重要的安全防护手段之一. 结合项目中实际使用情况,介绍下前后端参数签名校验实现方案. 签名校验规则 http请求,有两种传参形式: 1.通过url传参,最常见 ...

  3. WebApi基于Token和签名的验证

    最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...

  4. 【转】js生成接口请求参数签名加密

    js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...

  5. js生成接口请求参数签名加密

    js生成接口请求参数签名加密 定义规则:将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再 ...

  6. 分享一款一直在维护的【网络开发运维|通用调试工具】: http请求, websocket,cmd, RSA,DES, 参数签名工具,脚本批量生成工具,google动态口令,端口检测,组件注册,js混淆...

    首先发下下载地址:https://files.cnblogs.com/files/taohuadaozhu/ConfigLab.Test.ex.rar 日常开发,运维,跨部门跨公司对接中.  想快速调 ...

  7. 防盗链之URL参数签名

    一.概述 传统的 IP 禁用.referer 防盗链.User-Agent 防盗链.地区访问控制等防盗链措施已经无法完全满足用户要求,所以开发出URL参数签名方式来防盗链 二.实现 Token防盗链是 ...

  8. Token以及签名signature的设计与实现

    LZ第一次给app写开放接口,把自己处理Token的实现记录下来,目的是如果以后遇到好的实现,能在此基础上改进.这一版写法非常粗糙,写出来就是让大家批评的,多多指教,感谢大家. 当初设计这块想达到的效 ...

  9. 防盗链之URL参数签名 总结

    一.概述 传统的 IP 禁用.referer 防盗链.User-Agent 防盗链.地区访问控制等防盗链措施已经无法完全满足用户要求,所以开发出URL参数签名方式来防盗链 二.实现 Token防盗链是 ...

随机推荐

  1. iOS 网络请求中的空类型字符串转换

    创建一个工具类,   .h: #import <Foundation/Foundation.h> @interface MySetNullWithStrTool : NSObject +( ...

  2. day3:vcp考试

    Q41. An administrator creates a custom ESXi firewall rule using an XML file, however the rules do no ...

  3. iOS - OC - 网络请求 - 中文转码

    #import "ViewController.h" @interface ViewController () @end @implementation ViewControlle ...

  4. 17-js 提交表单以及判空

    js

  5. 运行代码后出现Process finished with exit code 0是为什么?

    Process finished with exit code 0 意味着你的程序正常执行完毕并退出. 可以科普一下exit code,在大部分编程语言中都适用: exit code 0 表示程序执行 ...

  6. 那些你不知道的PS大片摄影

    你以为这张照片是P出来的? 才不是! 人家是开个起重机吊着拍的! 而且没有任何保护措施! 这样的照片战斗民族的摄影师才敢这样拍…要是在天朝这么做估计都找不到模特… 这张照片出自乌兹别克斯坦的摄影师Ra ...

  7. Response.Redirect原理图解

  8. 设计模式之Adapter设计模式

    这个设计模式是我这两天刚学的,这儿算是我的读书笔记发布出来是供大家一起学习,后面有我自己的感悟,下面是我网上整理的 以下情况使用适配器模式 • 你想使用一个已经存在的类,而它的接口不符合你的需求. • ...

  9. 配置tomcat server.xml 文件 ,虚拟路径

    <Context path="/web" docBase="D:\workspace\web\src\main\webapp"  reloadable=& ...

  10. at java.net.InetAddress.getLocalHost(InetAddress.java:1475)

    今天在centos 安装hadoop安装完成后执行wordcount的时候报如下错误: at java.net.InetAddress.getLocalHost(InetAddress.java:14 ...