原文地址:

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 = ; i < bytes.Length; i++)             {                 string strX2 = bytes[i].ToString("X2");                 if (strX2.Substring(, ) == "")                 {                     strX2 = strX2.Substring(, );                 }                 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 = ; 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 = ; 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);         }

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

  1. 常用API接口签名验证参考

    项目中常用的API接口签名验证方法: 1. 给app分配对应的key.secret2. Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下: a. 按照请求参数名称将所有请求参数按照 ...

  2. 常用API接口汇总

    下面列举了100多个国内常用API接口,并按照 笔记.出行.词典.电商.地图.电影.即时通讯.开发者网站.快递查询.旅游.社交.视频.天气.团队协作.图片与图像处理.外卖.消息推送.音乐.云.语义识别 ...

  3. 常用API接口

    引用  常用API接口汇总

  4. API接口签名验证2

    http://www.jianshu.com/p/d47da77b6419 系统从外部获取数据时,通常采用API接口调用的方式来实现.请求方和�接口提供方之间的通信过程,有这几个问题需要考虑: 1.请 ...

  5. 开放api接口签名验证

    不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候, ...

  6. api接口签名验证(MD5)

    不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候, ...

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

    不要急,源代码分享在最底部,先问大家一个问题,你在写开放的API接口时是如何保证数据的安全性的?先来看看有哪些安全性问题在开放的api接口中,我们通过http Post或者Get方式请求服务器的时候, ...

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

    一.MD5参数签名的方式 我们对api查询产品接口进行优化: 1.给app分配对应的key.secret 2.Sign签名,调用API 时需要对请求参数进行签名验证,签名方式如下: a. 按照请求参数 ...

  9. html5视频常用API接口

    一.虽然有的属性是boolean类型,但仍旧建议按照XHTML书写(属性名=”属性值”)格式,避免出现错误 (下面加粗的属性为常用属性) 属性 值 功能描述 controls controls 是否显 ...

随机推荐

  1. Android ViewFlow的一个例子

    完成这个例子的步骤: 1.下载ViewFlow的源码,然后将类ViewFlow放在自己的工程的src的某个包下. 2.下载的源码里有2个工程view flow,viewflow-example.将vi ...

  2. XML自己定义检查器语法+约束(1)

    每次使用它检查xml文件时,仅仅需改动xmldoc.load("xml文件名称");中的文件名称,然后将该文件放在浏览器中执行就可以. 依据浏览器弹出的对话框进行推断自己写的xml ...

  3. 索引时利用K-邻近算法过滤重复歌曲

    最近一直在做公司搜索的优化与维护,做完索引和搜索的分离之后,又有一个新需求,因为做的是歌曲方面的搜索,所以在数据库中有多个同歌名,同演唱者的的数据,这样在用户搜索的时候,会出来一大堆不同版本的歌曲,影 ...

  4. 静态代码检查工具 cppcheck 的使用

      CppCheck是一个C/C++代码缺陷静态检查工具.不同于C/C++编译器及其它分析工具,CppCheck只检查编译器检查不出来的bug,不检查语法错误.所谓静态代码检查就是使用一个工具检查我们 ...

  5. Ubuntu12.04下使用valgrind内存测试工具测试Qt程序

    1. 到官网http://valgrind.org/downloads/上下载valgrind最新版本: 2. 解压源码,执行./configure;make;make install后,默认安装到/ ...

  6. RPM包校验和提取

    一.RPM包校验 [root@localhost Packages]# rpm -V 已安装的包名 #选项: #    -V    校验指定RPM包中的文件(verify) [root@localho ...

  7. nyoj 76

    #include <iostream> using namespace std; int main() { int i,t,n; int a[101]; cin>>t; whi ...

  8. Error prompt:“xxx is not in the sudoers file”----Solution

    //Situation    System prompts "xxx is not in the sudoers file"(xxx equals the user name) w ...

  9. 查看oracle数据库下面的所有的表,执行某个sql脚本:

    查看oracle数据库下面的所有的表: select * from user_tables;//user为用户名 执行某个sql脚本: SQL>@e 文件名.sql

  10. [<DDGuessYouLIkeModel 0x7c99faf0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key star.

    出现这个提示是由于以下原因造成: 这里我用到了MJExtension将字典转为模型,但再转为模型的时候,出现这个提示,原因就是因为NSInteger后面多一个一个“*” @property (nona ...