转载-常用API接口签名验证参考

原文地址:

http://www.cnblogs.com/hnsongbiao/p/5478645.html

写的很好,就做个笔记了。感谢作者!

项目中常用的API接口签名验证方法:

1. 给app分配对应的key、secret
2. Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下:
   a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvaluekeyvalue...keyvalue  字符串如:将arong=1,mrong=2,crong=3 排序为:arong=1, crong=3,mrong=2  然后将参数名和参数值进行拼接得到参数字符串:arong1crong3mrong2;
  b. 将secret加在参数字符串的头部后进行MD5加密 ,加密后的字符串需大写。即得到签名Sign;

大致处理过程

// 用户验证、判断key是否存在,同时查询出对应的secret用于验证;

....

// 验证签名,根据算法将参数进行签名得到sign与参数中的sign进行对比;

....

// 插叙数据获取列表

如下图

app调用:http://api.test.com/getproducts?key=app_key&sign=BCC7C71CF93F9CDBDB88671B701D8A35&参数1=value1&参数2=value2.......
注:secret 仅作加密使用, 为了保证数据安全请不要在请求参数中使用。

请求的唯一性: 为了防止别人重复使用请求参数问题,我们需要保证请求的唯一性,就是对应请求只能使用一次,这样就算别人拿走了请求的完整链接也是无效的。
唯一性的实现:在如上的请求参数中,我们加入时间戳 :timestamp(yyyyMMddHHmmss),同样,时间戳作为请求参数之一,也加入sign算法中进行加密。

下面提供2个签名验证的方法:时间戳注意加入及验证的处理

1、OpenId签名及验证

        /// <summary>         /// 生成Code         /// </summary>         /// <param name="openid">openid</param>         /// <param name="key">向谁跳传谁规定的key</param>         /// <returns></returns>         public static string MakeCode(string openid, string key)         {             DateTime time = DateTime.Now;             string data = time.ToString("dd") + "_" + openid + "_" + time.ToString("yyyy") + "_" + key + "_" + time.ToString("MM");             MD5 md5 = new MD5CryptoServiceProvider();             byte[] result = Encoding.Default.GetBytes(data);             byte[] output = md5.ComputeHash(result);             data = BitConverter.ToString(output).Replace("-", "").ToLower();             SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider();             byte[] bytes = sha1.ComputeHash(Encoding.ASCII.GetBytes(data));//"596d42faf5710b35c7ea0f0a9600ee31"  F69D39E1CA07FC23C1CE62F549E9D5B9780             //转16进制 清除前面0             StringBuilder strB = new StringBuilder();             for (int i = 0; i < bytes.Length; i++)             {                 string strX2 = bytes[i].ToString("X2");                 if (strX2.Substring(0, 1) == "0")                 {                     strX2 = strX2.Substring(1, 1);                 }                 strB.Append(strX2);             }             return strB.ToString();         }         /// <summary>         /// Code验证         /// </summary>         /// <param name="openid">openid</param>         /// <param name="code">待验证的数据</param>         /// <param name="key">自己系统规定的key</param>         /// <returns></returns>         public static bool ValidateCode(string openid, string code, string key)         {             string signedData = MakeCode(openid, key);             return code.Equals(signedData, StringComparison.OrdinalIgnoreCase);         }

2、请求参数签名及验证

        /// <summary>         /// 给请求签名         /// </summary>         /// <param name="parameters">所有字符型的请求参数</param>         /// <param name="secret">签名密钥</param>         /// <param name="qhs">是否前后都加密进行签名</param>         /// <returns></returns>         public string SignRequest(IDictionary<string, string> parameters, string secret, bool qhs)         {             // 第一步:把字典按Key的字母顺序排序             IDictionary<string, string> sortedParams = new SortedDictionary<string, string>(parameters);             IEnumerator<KeyValuePair<string, string>> dem = sortedParams.GetEnumerator();             // 第二步:把所有参数名和参数值串在一起             StringBuilder query = new StringBuilder(secret);             while (dem.MoveNext())             {                 string key = dem.Current.Key;                 string value = dem.Current.Value;                 if (!string.IsNullOrWhiteSpace(key))//!string.IsNullOrWhiteSpace(value) 空值也加入计算??                 {                     query.Append(key).Append(value);                 }             }             if (qhs)             {                 query.Append(secret);             }             // 第三部:使用md5运算             MD5 md5 = MD5.Create();             byte[] bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(query.ToString()));             // 第四部:把二进制转为大写的十六进制             StringBuilder result = new StringBuilder();             for (int i = 0; i < bytes.Length; i++)             {                 result.Append(bytes[i].ToString("X2"));             }             return result.ToString();         }          /// <summary>         /// 验证签名         /// </summary>         /// <returns></returns>         public bool ValidateSign(string secret)         {             string method = HttpContext.Current.Request.HttpMethod;             System.Collections.Specialized.NameValueCollection form = HttpContext.Current.Request.QueryString;             switch (method)             {                 case "POST":                     form = HttpContext.Current.Request.Form;                     break;                 case "GET":                     form = HttpContext.Current.Request.QueryString;                     break;                 default:                     return false;             }             IDictionary<string, string> parameters = new Dictionary<string, string>();             string sign = string.Empty;             for (int i = 0; i < form.Count; i++)             {                 string key = form.Keys[i];                 if (string.Equals(key,"sign",StringComparison.OrdinalIgnoreCase))                 {                      sign = form["sign"];                     continue;                 }                 parameters.Add(key,form[key]);             }             return string.Equals(SignRequest(parameters, secret, false), sign,StringComparison.OrdinalIgnoreCase);         }

时间: 2024-10-15 12:23:58

转载-常用API接口签名验证参考的相关文章

常用API接口签名验证参考

项目中常用的API接口签名验证方法: 1. 给app分配对应的key.secret2. Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下: a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvaluekeyvalue...keyvalue  字符串如:将arong=1,mrong=2,crong=3 排序为:arong=1, crong=3,mrong=2  然后将参数名和参数值进行拼接得到参数字符串:arong1crong3mrong2: b. 将secr

开放api接口签名验证

不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如: 请求来源(身份)是否合法? 请求参数被篡改? 请求的唯一性(不可复制) 为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证. 案列分析 我们通过给某 [移动端(app)] 写 [后台接口(api)] 的案例进行分析: 客户端: 以下简称app 后

【转】开放api接口签名验证

不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候,会面临着许多的安全性问题,例如: 1. 请求来源(身份)是否合法? 2. 请求参数被篡改? 3. 请求的唯一性(不可复制) 为了保证数据在通信时的安全性,我们可以采用参数签名的方式来进行相关验证. 案列分析 我们通过给某 [移动端(app)] 写 [后台接口(api)] 的案例进行分析: 客户端:

springcloud提供开放api接口签名验证

一.MD5参数签名的方式 我们对api查询产品接口进行优化: 1.给app分配对应的key.secret 2.Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下: a. 按照请求参数名称将所有请求参数按照字母先后顺序排序得到:keyvaluekeyvalue...keyvalue  字符串如:将arong=1,mrong=2,crong=3 排序为:arong=1, crong=3,mrong=2  然后将参数名和参数值进行拼接得到参数字符串:arong1crong3mrong

api接口签名验证

由于http是无状态的,所以正常情况下在浏览器浏览网页,服务器都是通过访问者的cookie(cookie中存储的jsessionid)来辨别客户端的身份的,当客户端进行登录服务器也会将登录信息存放在服务器并与客户端的cookie中的jsessionid关联起来,这样客户端再次访问我们就可以识别用户身份了. 但是对于api服务器,我们不能让访问者先登录再进行访问这样不安全,也不友好.所以一般情况我们都是需要客户端提供一个key(每个key跟用户是一对一关联的)来识别请求者的身份. 由HTTP协议进

PHP API接口签名验证

hash_hmac 在php中hash_hmac函数就能将HMAC和一部分哈希加密算法相结合起来实现HMAC-SHA1  HMAC-SHA256 HMAC-MD5等等算法.函数介绍如下: string hash_hmac(string $algo, string $data, string $key, bool $raw_output = false) algo:要使用的哈希算法名称,可以是上述提到的md5,sha1等 data:要进行哈希运算的消息,也就是需要加密的明文. key:使用HMAC

appium 基础:常用api接口(2)

一.获取手机分辨率 size=driver.get_window_size()#获取手机屏幕大小,分辨率 print(size)#{'width': 720, 'height': 1280} 得到的是一个字典,从而获取到手机的宽和高 height=size.get('height') width=size.get('width') 二.滑屏和拖拽 通过坐标实现划屏操作.那么首先我们要设置起始坐标的x,y和终点坐标的x,y.然后通过swipe方法实现划屏 s_x=width*0.5#0.5相当于宽

小程序常用API介绍

小程序常用API接口 ? wx.request https网络请求 wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 method:"GET", data: { x: '' , y: '' }, header: { 'content-type': 'application/json' }, success: function(res) { console.log(res.data) } }) ? 本地缓存 ? 通过key的形式添加缓存setS

[转载]android常用的API接口调用

原文地址:android常用的API接口调用作者:宋耀 显示网页:         Uri uri = Uri.parse("http://www.google.com"); Intent it = new Intent(Intent.ACTION_VIEW,uri); startActivity(it);显示地图: Uri uri = Uri.parse("geo:38.899533,-77.036476"); //Uri uri = Uri.parse(&quo