API签名算法
出自淘宝开放平台 - 开发文档
跳转到: 导航, 搜索
API2.0签名算法描述:
API调用,应用级参数sign生成规则:
∙ 1、参数变化
1、增加:sign_method,该字段属于可选类型。可选值(md5,hmac)
2、v参数赋值为:2.0
∙ 2、拼装
根据参数名称将你的所有请求参数按照字母先后顺序排序:key + value .... key + value
value对是除签名和图片外的所有请求参数按key做的升序排列, value无需编码。
例如将foo=1,bar=2,baz=3 排序为bar=2,baz=3,foo=1
参数名和参数值链接后,得到拼装字符串bar2baz3foo1
∙ 3、签名(utf-8编码)
1、md5:将secretcode同时拼接到参数字符串头、尾部进行md5加密,再转化成大写,格式是:uppercase(secret)。例如:uppercase(md5(secretbar2baz3foo1secret))
2、hmac:采用hmac的md5方式,secretcode只在头部的签名后,再转化成大写,格式是:uppercase(, secret))。例如:uppercase(hmac(bar2baz3foo1,secret))
∙ 4、示例:
1、md5签名的例子:
gw.api.taobao/router/rest?app_key=12020133&fields=desc&format=xml&iid=638
46231213263ff29f3c20209038c67&method=&nick=hz0799&sign=3B719BDD9499E9B18107F68F5EFA5BBF&sign_method=md5×tamp=2010-01-06%2017:51:30&v=2.0
2、hmac签名的例子:
gw.api.taobao/router/rest?app_key=12020133&fields=desc&format=xml&iid=63846231213263ff29f3c20209038c67&method=&nick=hz0799&sign=77DF3EC788D301A16D6EC16F79F767A9&sign_method=hmac×tamp=2010-01-07%2012:12:23&v=2.0
MD5算法代码片段:
/** * 新的md5签名,首尾放secret。 * * @param params 传给服务器的参数 * * @param secret 分配给您的APP_SECRET */ public static String md5Signature(TreeMap<String, String> params, String secret) { String result = null; StringBuffer orgin = getBeforeSign(params, new StringBuffer(secret)); if (orgin == null) return result; // secret last orgin.append(secret); 签名字符串是什么try { MessageDigest md = Instance("MD5"); result = byte2hex(md.String().getBytes("utf-8"))); } catch (Exception e) { throw new java.lang.RuntimeException("sign error !"); } return result; } /** * 二行制转字符串 */ private static String byte2hex(byte[] b) { StringBuffer hs = new StringBuffer(); String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (java.HexString(b[n] & 0XFF)); if (stmp.length() == 1) hs.append("0").append(stmp); else hs.append(stmp); } String().toUpperCase(); } /** * 添加参数的封装方法 * @param params * @param orgin * @return */ private static StringBuffer getBeforeSign(TreeMap<String, String> params, StringBuffer orgin) { if (params == null) return null; Map<String, String> treeMap = new TreeMap<String, String>(); treeMap.putAll(params); Iterator<String> iter = treeMap.keySet().iterator(); while (iter.hasNext()) { String name = (String) (); orgin.append(name).(name)); } return orgin; } |
HMAC算法代码片段:
/** * 新的md5签名,hmac加密 * * @param params 传给服务器的参数 * * @param secret 分配给您的APP_SECRET */ public static String hmacSignature(TreeMap<String, String> params, String secret) { String result = null; StringBuffer orgin = getBeforeSign(params, new StringBuffer()); if (orgin == null) return result; try { result = byte2hex(String().getBytes("utf-8"), secret)); } catch (Exception e) { throw new java.lang.RuntimeException("sign error !"); } return result; } /** * HMAC加密算法 * * @param data * @param key * @return * @throws Exception */ public static byte[] encryptHMAC(byte[] data, String key) throws Exception { SecretKey secretKey = new Bytes("utf-8"), "HmacMD5"); Mac mac = Algorithm()); mac.init(secretKey); return mac.doFinal(data); } |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论