在微信或支付宝等应用接入过程中,经常会用到传递参数的验证操作,以下就是最常用的一种:
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
/**
* @Description 测试
* @Notes 未填写备注
* @author ming.li
* @Date 2018年3月28日 上午11:02:05
* @version 1.0
* @since JDK 1.8
*/
public class Test {
/**
* @description 验证
* @param paraMap
* @return
* @returnType boolean
* @author ming.li
*/
private boolean check(Map<String, Object> paraMap) {
try {
String signUrl = formatUrlMap(paraMap, false, true);
String serverSign = md5Str(signUrl);
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
/**
* MD5计算
*
* @param url
* @return
*/
public static String md5Str(String url) {
try {
// 得到一个信息摘要器
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] result = digest.digest(url.getBytes());
StringBuffer buffer = new StringBuffer();
// 把每一个byte 做一个与运算 0xff;
for (byte b : result) {
// 与运算
int number = b & 0xff;// 加盐
String str = Integer.toHexString(number);
if (str.length() == 1) {
buffer.append("0");
}
buffer.append(str);
}
// 标准的md5加密后的结果
return buffer.toString().toUpperCase();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
}
/**
* 格式化排序
*
* @param paraMap
* @param urlEncode
* @param keyToLower
* @return
*/
public static String formatUrlMap(Map<String, Object> paraMap, boolean urlEncode, boolean keyToLower) {
String buff = "";
Map<String, Object> tmpMap = paraMap;
try {
List<Map.Entry<String, Object>> infoIds = new ArrayList<Map.Entry<String, Object>>(tmpMap.entrySet());
// 对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)
Collections.sort(infoIds, new Comparator<Map.Entry<String, Object>>() {
@Override
public int compare(Map.Entry<String, Object> o1, Map.Entry<String, Object> o2) {
return (o1.getKey()).toString().compareTo(o2.getKey());
}
});
// 构造URL 键值对的格式
StringBuilder buf = new StringBuilder();
for (Map.Entry<String, Object> item : infoIds) {
if (!StringUtils.isEmpty(item.getKey())) {
String key = item.getKey();
String val = String.valueOf(item.getValue());
if (urlEncode) {
val = URLEncoder.encode(val, "utf-8");
}
if (keyToLower) {
buf.append(key.toLowerCase() + "=" + val);
} else {
buf.append(key + "=" + val);
}
buf.append("&");
}
}
buff = buf.toString();
if (buff.isEmpty() == false) {
buff = buff.substring(0, buff.length() - 1);
}
} catch (Exception e) {
return null;
}
return buff;
}
}
首先,将参数进行名称排序。
然后,计算MD5摘要值。
最后,进行比对判断。