珂珂的个人博客 - 一个程序猿的个人网站

URL 签名验证

   调用API 当然安全很重要,不然谁都可以调用显然不行。这个方法还是参照百度云存储的,我自己定义了规则

前缀URL:http://192.168.1.161/cargo

提交参数说明

字段取值是否必须描述
ak
系统分配的的appKey
time
当前时间,格式yyyyMMddHHmmss 不能与服务器时间相差大于5分钟
token
-非登录接口必须,该值从登录后返回的用户信息获取
ip
IP限制
sign
用系统分配的密钥进行URL签名

以上参数用GET方式传输 如:http://192.168.1.161/cargo/User/Login.ashx?ak=afbf3d192908477d9e24b3e351bc4ebe&time=20140827203145&ip=8.8.8.8&sign=xxxxxxxx

签名方法:
对参数的每一个值从a到z的顺序排序,若遇到相同首字母,则看第二个字母,以此类推。
排序完成之后,再把所有数组值以“&”字符连接起来,如上面的URL则为:ak=afbf3d192908477d9e24b3e351bc4ebe&ip=8.8.8.8&time=20140827203145
如遇特殊字符,前面字符串扔是原字符串,但是传递时需进行url编码
例如:需要对请求参数email进行数字签名,那么待签名数据应该是email=admin@kecq.com,而不是email=admin%40kecq.com。但是传递则是email=admin%40kecq.com
再将此字符串与相对url和问号进行连接。如:/cargo/User/Login.ashx?   注意以"/"开头
那么最后的签名字符串就是: /cargo/User/Login.ashx?ak=afbf3d192908477d9e24b3e351bc4ebe&ip=8.8.8.8&time=20140827203145
再对此字符串进行HMACSHA1 签名,再进行Base64编码,再对Base64编码后的字符串进行Url编码
最后请求url则为http://192.168.1.161/cargo/User/Login.ashx?ak=afbf3d192908477d9e24b3e351bc4ebe&time=20140827203145&ip=8.8.8.8&sign=xxxxxxxx

公共返回示例:{"code":"-1","message":"登录名或密码错误"}

结果说明:code代表返回的代码,大于0表示成功,小于0表示失败,message代表返回结果描述

appKey:e10d8f2c03e3411f93b516d247f7e1d4

AppSecret:d67fac11da1e45a28af2c946e3992449

JAVA签名示例:

        byte[] key="d67fac11da1e45a28af2c946e3992449".getBytes("utf-8");
		byte[] data="/cargo/User/Login.ashx?ak=afbf3d192908477d9e24b3e351bc4ebe&ip=8.8.8.8&time=20140827203145".getBytes("utf-8");
		SecretKeySpec signingKey = new SecretKeySpec(key, "HMAC_SHA1");  
        Mac mac = Mac.getInstance("HMAC_SHA1");  
        mac.init(signingKey);  
        byte[] signByte = mac.doFinal(data); 
        String sign2=new String(it.sauronsoftware.base64.Base64.encode(signByte));
        System.out.print(sign2);


c# 对数据hmac签名的代码

/// <summary>
        /// 对数据进行Hmac签名
        /// </summary>
        /// <param name="valueStr">要签名的数据</param>
        /// <param name="keyStr">密钥</param>
        /// <returns></returns>
        public static string Hmac(string valueStr, string keyStr)
        {
            HMAC hmac = HMACSHA1.Create();
            //源数据
            var data = System.Text.Encoding.UTF8.GetBytes(valueStr);
            //密钥
            var key = System.Text.Encoding.UTF8.GetBytes(keyStr);
            //设置密钥
            hmac.Key = key;
            //计算哈希值
            var hash = hmac.ComputeHash(data);
            //对数据进行签名
            var signedData = hash.Concat(data).ToArray();
            var receivedHash = signedData.Take(hmac.HashSize >> 3).ToArray();

            String str = HttpUtility.UrlEncode(Convert.ToBase64String(receivedHash));

            return str;
        }



上一篇:jUploader上传

下一篇:个人代码全部开源


0 评论

查看所有评论

给个评论吧