package com.yanek.test; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.GeneralSecurityException; import java.security.MessageDigest; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; /** * 请求参数签名工具类 * */ public class ParamsSignUtil { public static void main(String[] args) { //参数签名算法测试例子 HashMap<String, String> signMap = new HashMap<String, String>(); signMap.put("devid","920BF4CE-B9CC-449C-A146-BC5549D899ED"); signMap.put("devtype","1"); signMap.put("pcode","010210000"); signMap.put("t","1472701601599"); signMap.put("uid","0"); signMap.put("v","4.5.3"); signMap.put("ver","1.0"); String secret_key="$3@%$$#"; //加密secret System.out.println("得到签名sign1:"+getSign(signMap,secret_key)); HashMap<String, String> SignHashMap=ParamsSignUtil.sign(signMap, secret_key); //System.out.println("SignHashMap:"+SignHashMap); String sign=(String)SignHashMap.get("appSign"); //获取参数签名字符串 System.out.println("得到签名sign2:"+sign); } public static HashMap<String, String> sign(Map<String, String> paramValues, String secret) { return sign(paramValues, null, secret); } /** * @param paramValues * @param ignoreParamNames * @param secret * @return */ public static HashMap<String, String> sign(Map<String, String> paramValues, List<String> ignoreParamNames, String secret) { try { HashMap<String, String> signMap = new HashMap<String, String>(); StringBuilder sb = new StringBuilder(); List<String> paramNames = new ArrayList<String>(paramValues.size()); paramNames.addAll(paramValues.keySet()); if (ignoreParamNames != null && ignoreParamNames.size() > 0) { for (String ignoreParamName : ignoreParamNames) { paramNames.remove(ignoreParamName); } } Collections.sort(paramNames); sb.append(secret); for (String paramName : paramNames) { sb.append(paramName).append(paramValues.get(paramName)); } sb.append(secret); byte[] md5Digest = getMD5Digest(sb.toString()); String sign = byte2hex(md5Digest); signMap.put("appParam", sb.toString()); signMap.put("appSign", sign); return signMap; } catch (IOException e) { throw new RuntimeException("加密签名计算错误", e); } } public static String utf8Encoding(String value, String sourceCharsetName) { try { return new String(value.getBytes(sourceCharsetName), "UTF-8"); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException(e); } } private static byte[] getMD5Digest(String data) throws IOException { byte[] bytes = null; try { MessageDigest md = MessageDigest.getInstance("MD5"); bytes = md.digest(data.getBytes("UTF-8")); } catch (GeneralSecurityException gse) { throw new IOException(gse); } return bytes; } private static String byte2hex(byte[] bytes) { StringBuilder sign = new StringBuilder(); for (int i = 0; i < bytes.length; i++) { String hex = Integer.toHexString(bytes[i] & 0xFF); if (hex.length() == 1) { sign.append("0"); } //sign.append(hex.toUpperCase()); sign.append(hex.toLowerCase()); } return sign.toString(); } public static String getSign(Map<String, String> params,String secret) { String ret=""; StringBuilder sb = new StringBuilder(); Set<String> keyset=params.keySet(); TreeSet<String> sortSet=new TreeSet<String>(); sortSet.addAll(keyset); Iterator<String> it=sortSet.iterator(); sb.append(secret); while(it.hasNext()) { String key=it.next(); String value=params.get(key); sb.append(key).append(value); } sb.append(secret); byte[] md5Digest; try { md5Digest = getMD5Digest(sb.toString()); ret = byte2hex(md5Digest); } catch (IOException e) { e.printStackTrace(); } return ret; } }
输出如下:
得到签名sign1:d218314413dc847bc34ca8a10d7f9b1a
得到签名sign2:d218314413dc847bc34ca8a10d7f9b1a