package org.springblade.common.utils;
|
|
import com.google.common.hash.Hashing;
|
import org.slf4j.Logger;
|
import org.slf4j.LoggerFactory;
|
|
import java.io.IOException;
|
import java.security.MessageDigest;
|
import java.util.Arrays;
|
import java.util.Map;
|
|
public class Md5SignUtil {
|
private final static Logger logger = LoggerFactory.getLogger(Md5SignUtil.class);
|
|
public static String signRequest(Map<String, Object> params, String secret) throws IOException {
|
// 第一步:检查参数是否已经排序
|
String[] keys = params.keySet().toArray(new String[0]);
|
Arrays.sort(keys);
|
|
// 第二步:把所有参数名和参数值串在一起
|
StringBuilder query = new StringBuilder();
|
query.append(secret);
|
for (String key : keys) {
|
Object o = params.get(key);
|
if (o!= null && o!="") {
|
query.append(key).append(o);
|
}
|
}
|
query.append(secret);
|
// logger.info("query={}",query);
|
|
// 第三步:使用MD5加密
|
byte[] bytes = encryptMD5(query.toString());
|
|
// 第四步:把二进制转化为大写的十六进制(正确签名应该为32大写字符串,此方法需要时使用)
|
return byte2hex(bytes);
|
}
|
|
public static byte[] encryptMD5(String data) throws IOException {
|
return Hashing.md5().hashBytes(data.getBytes("utf-8")).asBytes();
|
}
|
|
public 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();
|
}
|
|
/***
|
* MD5加码 生成32位md5码
|
*/
|
public static String string2MD5(String inStr) {
|
MessageDigest md5 = null;
|
try {
|
md5 = MessageDigest.getInstance("MD5");
|
} catch (Exception e) {
|
e.printStackTrace();
|
return "";
|
}
|
char[] charArray = inStr.toCharArray();
|
byte[] byteArray = new byte[charArray.length];
|
|
for (int i = 0; i < charArray.length; i++) {
|
byteArray[i] = (byte) charArray[i];
|
}
|
byte[] md5Bytes = md5.digest(byteArray);
|
StringBuffer hexValue = new StringBuffer();
|
for (int i = 0; i < md5Bytes.length; i++) {
|
int val = ((int) md5Bytes[i]) & 0xff;
|
if (val < 16) {
|
hexValue.append("0");
|
}
|
hexValue.append(Integer.toHexString(val));
|
}
|
return hexValue.toString();
|
}
|
|
/**
|
* 加密解密算法 执行一次加密,两次解密
|
*/
|
public static String convertMD5(String inStr) {
|
|
char[] a = inStr.toCharArray();
|
for (int i = 0; i < a.length; i++) {
|
a[i] = (char) (a[i] ^ 't');
|
}
|
String s = new String(a);
|
return s;
|
|
}
|
|
}
|