作用: 在http接口对参数做签名,防止接口被非法调用
package com.yanek.util;
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.List;
import java.util.Map;
/**
* 请求参数签名工具类
*
*/
public class ParamSignUtils {
public static void main(String[] args)
{
HashMap<String, String> signMap = new HashMap<String, String>();
signMap.put("a","01");
signMap.put("c","02");
signMap.put("b","03");
String secret="test";
HashMap SignHashMap=ParamSignUtils.sign(signMap, secret);
System.out.println("SignHashMap:"+SignHashMap);
List<String> ignoreParamNames=new ArrayList<String>();
ignoreParamNames.add("a");
HashMap SignHashMap2=ParamSignUtils.sign(signMap,ignoreParamNames, secret);
System.out.println("SignHashMap2:"+SignHashMap2);
}
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[] getSHA1Digest(String data) throws IOException {
byte[] bytes = null;
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
bytes = md.digest(data.getBytes("UTF-8"));
} catch (GeneralSecurityException gse) {
throw new IOException(gse);
}
return bytes;
}
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());
}
return sign.toString();
}
}