[置顶] webapi token、参数签名是如何生成的
一个问题
在这里我想问大家一句,如果你向一个刚刚接触.net web后端程序开发的同学(别人刚刚也就学了webform的request,response,会提交表单的这种刚接触不久的同学),你怎么去解释标题“webapi token验证”。
简单的来说我的答案是:“要对客户端(浏览器,app)发的请求(提交表单)加限制,这个限制就是不要随随便便就去接收个请求就出查询数据库,最基本的判断要证明此请求是”谁发出的。
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如何生成的?作用是什么?
[Route("login")]
public bool login(string account, string pwd)
{
var obj = Db.dbUsers.FirstOrDefault(f => f.Account == account && f.Pwd == pwd);
if (obj != null)
{
string token = account.DESEncrypt(desKey);//加密产生token,
HttpCookie cookie = new HttpCookie(cookieToken,token);
HttpContext.Current.Response.Cookies.Add(cookie);//保存cookie
return true;
}
else
{
return false;
}
}
[Route("list"), HttpGet]
public List<string> List(string type,string token)
{
var obj = Db.dbUsers.FirstOrDefault(p => p.Account == token.DESDecrypt(desKey));
//验证token
if (obj != null)
{
//返回数据集
}
else
{
//非法请求
}
}
public class MyFilterAttribute : Microsoft.AspNetCore.Mvc.Filters.ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
var request_param = context.ActionArguments.Values;
var queryCollection = context.HttpContext.Request.Query;
string account = string.Empty;
string password = string.Empty;
long timespan = 0;
string signature = string.Empty;
try
{
account = queryCollection.Where(p => p.Key == "account").Select(f => f.Value).FirstOrDefault().ToString();
password = queryCollection.Where(p => p.Key == "password").Select(f => f.Value).FirstOrDefault().ToString();
timespan = long.Parse(queryCollection.Where(p => p.Key == "timespan").Select(f => f.Value).FirstOrDefault().ToString());
signature = queryCollection.Where(p => p.Key == "signature").Select(f => f.Value).FirstOrDefault().ToString();
}
catch (Exception ex)
{
var apiresult = ApiResult<bool>.Error("参数异常"+ex.ToString());
context.Result = new JsonResult(apiresult);
}
//var accountName = context.RouteData.Values["accountName"].ToString()
var expires_minute = (timespan - DateTime.Now.Ticks) / 60000000000;
if (expires_minute> 10||expires_minute<-10)
{
var apimodel = ApiResult<bool>.Error("请求超时"+expires_minute);
//var json = JsonConvert.SerializeObject(apimodel);
JsonResult ret = new JsonResult(apimodel);
context.Result =ret;
}
var ok = ("account" + account + "password" + password).Contains(signature);//ToDO 加密解密
if (ok == false)
{
var apimodel = ApiResult<bool>.Error("非法请求");
var json = JsonConvert.SerializeObject(apimodel);
JsonResult ret = new JsonResult(apimodel);
context.Result = ret;
}
base.OnActionExecuting(context);
} }
作者:张林
原文标题:webapi
token、参数签名是如何生成的
原文链接:http://blog.csdn.net/kebi007/article/details/72861532
转载随意注明出处
[置顶] webapi token、参数签名是如何生成的的更多相关文章
- webapi token、参数签名是如何生成的(转载)
API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间 在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请 ...
- WebApi安全性 参数签名校验(结合Axios使用)
接口参数签名校验,是WebApi接口服务最重要的安全防护手段之一. 结合项目中实际使用情况,介绍下前后端参数签名校验实现方案. 签名校验规则 http请求,有两种传参形式: 1.通过url传参,最常见 ...
- [置顶] Web用户的身份验证及WebApi权限验证流程的设计和实现 (不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!!)
转发 http://blog.csdn.net/besley/article/details/8516894 不是Token驗證!!!不是Token驗證!!!都是基於用户身份的票据信息驗證!!! [ ...
- WebApi基于Token和签名的验证
最近一段时间在学习WebApi,涉及到验证部分的一些知识觉得自己并不是太懂,所以来博客园看了几篇博文,发现一篇讲的特别好的,读了几遍茅塞顿开(都闪开,我要装逼了),刚开始读有些地方不理解,所以想了很久 ...
- js改变数组的两个元素的位子,互换、置顶
//js数组的元素上移和下移动 var fieldData=[ {name:'id',value:'ID'} , {name:'username',value:'用户名'} , {name:'emai ...
- [置顶] Android开发笔记(成长轨迹)
分类: 开发学习笔记2013-06-21 09:44 26043人阅读 评论(5) 收藏 Android开发笔记 1.控制台输出:called unimplemented OpenGL ES API ...
- PHP RSA参数签名
为了防止在支付通信过程中的参数数据被篡改或者伪造,采用RSA进行数据签名和验证签名. RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密. ...
- Android自定义ScrollView实现一键置顶功能
效果图如下: (ps:动态图有太大了,上传不了,就给大家口述一下要实现的功能吧) 要实现的功能:当ScrollView向上滑动超过一定距离后,就渐变的出现一个置顶的按钮,当滑动距离小于我们指定的距离时 ...
- [置顶]VC2013的一个bug
[置顶]VC2013的一个bug 前段时间在尝试使用一个C++的GUI库nana.这个库最大的特点在于使用现代C++风格去编写GUI程序,而不需要使用大量的比较丑陋的代码(如MFC中的各种宏),或者其 ...
随机推荐
- JavaScript学习心得
javaScript十分的强大,所以自然而然学起来也是不易的,想要掌握它的核心,把它理解透更是不易的,但只要你能够静下心来,耐心的去钻研,学习,还是可以把它给学好的,加油吧! 下面是一些JavaScr ...
- 初学时遇到的小问题Your content must have a ListView whose id attribute is 'android.R.id.list'
问题提出 错误提示:Your content must have a ListView whose id attribute is 'android.R.id.list' 关于解决Your conte ...
- SaltStack 架构自动部署 03
架构图 模块化部署 系统模块:系统优化,内核参数,网络参数 功能模块:如:nginx,tomcat, 业务模块: 1.在salt-master端修改配置文件 [root@01 salt]# vim / ...
- vue2.x利用脚手架快速构建项目并引入bootstrap、jquery
要使用vue-cli脚手架搭建项目,首先需要安装node.js Node.js官网:https://nodejs.org/en/download/ 选择你对应的系统即可下载,下载完成后傻瓜式安装即可. ...
- django框架中的form组件的用法
form组件的使用 先导入: from django.forms import Form from django.forms import fields from django.forms impor ...
- Tomcat 日志分割
一.前言 随着每天业务的增长,Tomcat 的catalina.out日志 变得越来越大,占用磁盘空间不说.要查看某个时候的日志的时候,庞大的日志让你顿时无从下手,所以日志的切割的变得刻不容缓.而且, ...
- ##6.2 Neutron计算节点-- openstack pike
##6.2 Neutron计算节点 openstack pike 安装 目录汇总 http://www.cnblogs.com/elvi/p/7613861.html ##6.2 Neutron计算节 ...
- 算法训练 区间K大数
算法训练 区间k大数查询 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个. 输入格式 第一行包含一个数n,表示序列长度. ...
- 【MySQL】20个经典面试题,全部答对月薪10k+
Part2:经典题目 1.MySQL的复制原理以及流程 基本原理流程,3个线程以及之间的关联: 2.MySQL中myisam与innodb的区别,至少5点 (1).问5点不同: (2).innodb引 ...
- PHP 常用字符串函数
1.查找字符位置函数 strpos($str,search,[int]):查找search在$str中的第一次位置从int开始: stripos($str,search,[int]):函数返回字符串在 ...