webapi token、参数签名是如何生成的

小编 2026-07-03 阅读:1974 评论:0
一个问题在这里我想问大家一句,如果你向一个刚刚接触.net web后端程序开发的同学(别人刚刚也...

一个问题

在这里我想问大家一句,如果你向一个刚刚接触.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%也安全了)。

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

那么问题来

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

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

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

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

1.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返回的cookie值字符串,到了服务器端方法验证的时候再进行解密,获取到字符串zhanglin,然后将这个zhanglin与系统用户(可采用缓存数据库、缓存token的值)对比,如果对比存在,则说明有权限去访问api,反之非法的请求。
还是代码来实现一下吧。代码比较容易理解,就是为了把这个原理说清楚一点
        [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;            }        }
token的产生就是登陆之后根据用户标识保存在cookie里,这样在客户端每次发送请求的时候都会带上token这个参数,如下:
        [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            {                //非法请求            }        }

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方法
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
转载随意注明出处


版权声明

本文仅代表作者观点,不代表百度立场。
本文系作者授权百度百家发表,未经许可,不得转载。

热门文章
  • Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering

    Sequential Monte Carlo Methods (SMC) 序列蒙特卡洛/粒子滤波/Bootstrap Filtering
    Problem Statement 我们考虑一个具有马尔可夫性质、非线性、非高斯的状态空间模型(State Space Model):对于一个时间序列上的观测结果{yt,t∈N}\\{ y_t , t \\in N \\}{yt​,t∈N},我们认为每个观测结果yty_tyt​的生成依赖于一个无法直接观察的隐变量xt∈{xt,t∈N}x_t \\in \\{x_t , t \\in N \\}xt​∈{xt​,t∈N},即:p(...
  • 机房智能化温湿度解决方式之POE供电以太网温湿度传感器

    机房智能化温湿度解决方式之POE供电以太网温湿度传感器
    机房智能化温湿度解决方式之POE供电以太网温湿度传感器 北京盈创力和电子科技有限公司 智能型TCP网口温湿度记录仪 北京IP网络温湿度记录仪厂家,北京盈创力和 北京智能型TCP网口温湿度记录仪IP网络温湿度记录仪是一种新型的基于TCP/IP协议双绞线以太网标准温湿度采集模块,利用它可以实现现场温度值、相对湿度值的采集,同时利用其自身的RJ45通信接口可以方便地和机房监控主机或交换机集线器进行联网。 工作于-40℃~85℃工业级带...
  • Hive 系统函数及示例

    Hive 系统函数及示例
    查看所有系统函数 show functions; 函数分类 内置函数【系统函数】 数学函数: floor、round、ceil、cos、log2等 字符串函数: length、reverse、trim、lower、get_json_object、repeat等 收集函数: size 转换函数: cast 日期函数: year、month、datediff、date、date_add等 条件函数: coalesce、case…w...
  • HTTP状态保持的原理

    HTTP状态保持的原理
    a)在用户登录之后,浏览器返回响应的时候会在响应中添加上cookieb)浏览器接收到cookie之后会自动保存c)当用户再次请求同一服务器中的其他网页的时候,浏览器会自动带上之前保存的cookied)服务接收到请求之后可以请 request 对象中取到cookie 判断当前用户是否登录  Http是无状态的,就是连接时数据互通,关闭后...
  • CSRF的原理和防范措施

    CSRF的原理和防范措施
    a)攻击原理:i.用户C访问正常网站A时进行登录,浏览器保存A的cookieii.用户C再访问攻击网站B,网站B上有某个隐藏的链接或者图片标签会自动请求网站A的URL地址,例如表单提交,传指定的参数iii.而攻击网站B在访问网站A的时候,浏览器会自动带上网站A的cookieiv.所以网站A在接收到请求之后可判断当前用户是登录状态,所以...
标签列表