签名是消息交换双方进行数据校验的摘要信息,用来保证数据在网络传输过程中的数据一致性,剔除假冒和非法的请求数据。
MD5签名模式
签名流程:
签名生成规则:
把消息头header中appId和ts(msgdgt参数除外)、消息体按key的字母顺序排序。
排序后将密钥、消息头header中appId和ts和消息体的所有key、value串起来以UTF-8编码进行MD5加密,如:MD5(secretkey1value1key2value2..)。
说明当value为对象时,需根据对象key的hashcode顺序进行排序,将排序后的key、value串转换为字符串作为value加入验签前字符串。
若使用Java实现,则对象直接转换为hashmap即可。
生成32位摘要字符串,如:BA9854BED1A2986B061E2713F403C752。
示例代码:
package org.crypto.sign; import java.security.MessageDigest; import java.util.Iterator; import java.util.Map; import java.util.TreeMap; public class MD5 { public static void main(String[] args) throws Exception { //treeMap中需要put请求头加请求体中的所有参数,msgdgt参数除外。 Map<String, String> treeMap = new TreeMap<String, String>(); treeMap.put("appId","FC10000016848****"); treeMap.put("ts","20161114143116001"); //密钥 String secret = "1234567890abcdefghijk"; Iterator<String> iter = treeMap.keySet().iterator(); StringBuffer orgin = new StringBuffer(secret); while (iter.hasNext()) { String name = iter.next(); orgin.append(name).append(treeMap.get(name)); } //待签名数据 String content = orgin.toString(); MessageDigest md = MessageDigest.getInstance("MD5"); String result = byte2hex(md.digest(content.getBytes("utf-8"))); System.out.println("签名:"+result); } private static String byte2hex(byte[] b) { StringBuffer hs = new StringBuffer(); String stmp = ""; for (int n = 0; n < b.length; n++) { stmp = (Integer.toHexString(b[n] & 0XFF)); if (stmp.length() == 1) { hs.append("0").append(stmp); }else { hs.append(stmp); } } return hs.toString().toUpperCase(); } }
该文章对您有帮助吗?