HTML5技术

记录下Webapi签名机制 - Clark-苏

字号+ 作者:H5之家 来源:H5之家 2017-11-07 10:01 我要评论( )

首先,写这篇文章的原因是因为最近某一个项目中的接口被人为调用了,导致了数据库数据被串改。虽然是内部人无意点的,但还是引起了我的担忧,所有整理了下关于Webapi的相关签名机制。 一、我们在开发接口时,有时候嫌麻烦就懒进行相关的验证或只进行一些简单

  首先,写这篇文章的原因是因为最近某一个项目中的接口被人为调用了,导致了数据库数据被串改。虽然是内部人无意点的,但还是引起了我的担忧,所有整理了下关于Webapi的相关签名机制。

一、我们在开发接口时,有时候嫌麻烦就懒进行相关的验证或只进行一些简单的验证,这样客户端就可以直接调用:如

调用Webapi接口::8123/Token/GetTest?ID=123456

这种方式简单粗暴,在浏览器直接输入"http://XXX.XXX.XX.XXX:8123/Token/GetTest?ID=123456",即可获取产品列表信息了,但是这样的方式会存在很严重的安全性问题,没有进行任何的验证,大家都可以通过这个方法获取到产品列表,导致产品信息泄露,下面简单记录下使用使用TOKEN+签名认证

二、使用TOKEN+签名认证 保证请求安全性

  token+签名认证的主要原理是:1.做一个认证服务,提供一个认证的webapi,用户先访问它获取对应的token

                                      2.用户拿着相应的token以及请求的参数和服务器端提供的签名算法计算出签名后再去访问指定的api

              3.服务器端每次接收到请求就获取对应用户的token和请求参数,服务器端再次计算签名和客户端签名做对比,如果验证通过则正常访问相应的api,验证失败则 返回具体的失败信息

具体代码如下:

1.用户请求认证服务GetToken,将token保存在服务器端缓存中,并返回对应的Token到客户端(该请求不需要进行签名认证),使用GET调用方式

[HttpGet] public IHttpActionResult GetToken(string signKey) { if (string.IsNullOrEmpty(signKey)) return Json<ResultMsg>(new ResultMsg((int)ExceptionStatus.ParameterError, EnumExtension.GetEnumText(ExceptionStatus.ParameterError), null)); strKey = , WebConfig.signKey, signKey); Token cacheData = HttpRuntime.Cache.Get(strKey) as Token; if (cacheData == null) { cacheData = new Token(); cacheData.signId = signKey; cacheData.timespan = DateTime.Now.AddDays(1); cacheData.signToken = Guid.NewGuid().ToString(); //插入缓存,缓存时间为1天 HttpRuntime.Cache.Insert(strKey, cacheData, null, cacheData.timespan, TimeSpan.Zero); } Json<ResultMsg>(new ResultMsg((int)ExceptionStatus.OK, EnumExtension.GetEnumText(ExceptionStatus.OK), cacheData)); }

2.客户端调用方法,GET或POST

(1) GET:需要在请求头中添加:timespan(时间戳),nonce(随机数),signKey(key),signature(签名参数)

    public static T Get<T>(string url, string paras, string signId,bool isSign=true) { HttpWebRequest webrequest = null; HttpWebResponse webresponse = null; string strResult = string.Empty; try { webrequest = (HttpWebRequest)WebRequest.Create(url + + paras); webrequest.Method = ; webrequest.ContentType = ; webrequest.Timeout = 90000; timespan = GetTimespan(); string ran = GetRandom(10); webrequest.Headers.Add(, signId); DbLogger.LogWriteMessage(+ signId); webrequest.Headers.Add(, timespan); DbLogger.LogWriteMessage(+ timespan); webrequest.Headers.Add(, ran); DbLogger.LogWriteMessage(+ ran); if (isSign) { string strSign = GetSignature(signId, timespan, ran, paras); webrequest.Headers.Add(, strSign); DbLogger.LogWriteMessage(+ strSign); } webresponse = (HttpWebResponse)webrequest.GetResponse(); Stream stream = webresponse.GetResponseStream(); StreamReader sr = new StreamReader(stream, Encoding.UTF8); strResult = sr.ReadToEnd(); } catch (Exception ex) { return JsonConvert.DeserializeObject<T>(ex.Message); } finally { if (webresponse != null) webresponse.Close(); if (webrequest != null) webrequest.Abort(); } return JsonConvert.DeserializeObject<T>(strResult); }

(2)POST写法这里就不写了,同理需要设置header请求头参数:timespan(时间戳),nonce(随机数),signKey(key),signature(签名参数)

(3)根据请求参数计算本次请求的签名,用timespan+nonc+signKey+token+data(请求参数字符串)得到signStr签名字符串,然后再进行排序和MD5加密得到最终的signature签名字符串,添加到请求头中

GetSignature(string signKey, string timespan, string nonce, string data) { string signToken = string.Empty; var result = GetToken<JObject>(); if (result != null) { ].ToString() == ) { ].ToString()); if (tokena != null) signToken = tokena[].ToString(); } } var hash = MD5.Create(); string str = signKey + timespan + nonce + signToken + data; byte[] bytes = Encoding.UTF8.GetBytes(string.Concat(str.OrderBy(c => c))); DbLogger.LogWriteMessage(+ string.Concat(str.OrderBy(c => c))); md5Val = hash.ComputeHash(bytes); //把二进制转化为大写的十六进制 StringBuilder strSign = new StringBuilder(); foreach (var val in md5Val) { strSign.Append(val.ToString()); } return strSign.ToString(); }

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • WebApi系列~HttpClient的性能隐患 - 张占岭

    WebApi系列~HttpClient的性能隐患 - 张占岭

    2017-10-20 08:03

  • WebApi Ajax 跨域请求解决方法(CORS实现) - 简玄冰

    WebApi Ajax 跨域请求解决方法(CORS实现) - 简玄冰

    2017-08-10 15:00

  • 从.net到java,记录下这三个月的工作 - _liuxx

    从.net到java,记录下这三个月的工作 - _liuxx

    2017-08-09 15:01

  • WebApi2 文件图片上传下载 - 柒小栈主

    WebApi2 文件图片上传下载 - 柒小栈主

    2017-05-27 16:02

网友点评