调用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;
}
珂珂的个人博客 - 一个程序猿的个人网站