基于MD5加密的简单接口加密方法
最近在给第三方提供接口(http post)方法的时候,一直考虑这个加密,怎样简单有效,最终我参考了微信的签名方法,自己实现了下,写成工具类,有需要的可以参考一下:
-
-
一、签名规则:
数值的参数去掉key为空的数据,然后按照Collections.sort()方法默认排序,使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串strA;
2) strA最后拼接上key得到strSignTemp字符串,并对strSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到signatures值。
举例:
请求参数如下:
entrustmentOrderId : 1234567890
entrustmentOrderStatus : 3
第一步:对参数进行Collections.sort()方法默认排序,按照key=value的格式组成字符串如下:
strA="entrustmentOrderId=1234567890&entrustmentOrderStatus=3";
第二步:拼接key并签名:
strSignTemp=strA+"&key=6b323d7ed39e0008";
signatures=MD5(strSignTemp).toUpperCase();
二、密钥设置
密钥值:6b323d7ed39e0008
三、签名工具代码
package com.test.util;
import java.security.MessageDigest;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
public class MD5Util {
/**
*
* @Description: 生成MD5
* @author: tianpengw
* @param message
* @return
*/
public static String getMD5(String message) {
String md5 = "";
try {
MessageDigest md = MessageDigest.getInstance("MD5"); // 创建一个md5算法对象
byte[] messageByte = message.getBytes("UTF-8");
byte[] md5Byte = md.digest(messageByte); // 获得MD5字节数组,16*8=128位
md5 = bytesToHex(md5Byte); // 转换为16进制字符串
} catch (Exception e) {
e.printStackTrace();
}
return md5;
}
/**
*
* @Description: 二进制转十六进制
* @author: tianpengw
* @param bytes
* @return
*/
public static String bytesToHex(byte[] bytes) {
StringBuffer hexStr = new StringBuffer();
int num;
for (int i = 0; i < bytes.length; i++) {
num = bytes[i];
if (num < 0) {
num += 256;
}
if (num < 16) {
hexStr.append("0");
}
hexStr.append(Integer.toHexString(num));
}
return hexStr.toString().toUpperCase();
}
/**
*
* @Description: 签名:请求参数排序并后面补充key值,最后进行MD5加密,返回大写结果
* @author: tianpengw
* @param params 参数内容
* @param key key值
* @return
*/
public static String signatures(Map<String, Object> params, String key){
String signatures = "";
try {
List<String> paramsStr = new ArrayList<String>();
for (String key1 : params.keySet()) {
if(null != key1 && !"".equals(key1)){
paramsStr.add(key1);
}
}
Collections.sort(paramsStr);
StringBuilder sbff = new StringBuilder();
for (String kk : paramsStr) {
String value = params.get(kk).toString();
if ("".equals(sbff.toString())) {
sbff.append(kk + "=" + value);
} else {
sbff.append("&" + kk + "=" + value);
}
}
//加上key值
sbff.append("&key="+key);
signatures = getMD5(sbff.toString()).toUpperCase();
}catch(Exception e) {
e.printStackTrace();
}
return signatures;
}
}
工具里的东西没什么难度,这个key值可以自己定义然后告知第三方即可
到此工具类已经介绍完毕,有什么不明确的地方可以评论区回复