import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.security.MessageDigest;
import java.util.List;
import java.util.Map;
import org.apache.commons.codec.digest.DigestUtils;
public class MD5 extends BaseServices {
private static final String[] hexDigits = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D",
"E", "F"};
/**
* 签名字符串
*
* @param text 需要签名的字符串
* @param key 密钥
* @param input_charset 编码格式
* @return 签名结果
*/
public static String sign(String text, String key, String input_charset) {
text = text + key;
return DigestUtils.md5Hex(getContentBytes(text, input_charset));
}
/**
* 将需要签名的字符串按照编码格式转成数组
*
* @param content
* @param charset
*/
private static byte[] getContentBytes(String content, String charset) {
if (charset == null || "".equals(charset)) {
return content.getBytes();
}
try {
return content.getBytes(charset);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("MD5签名过程中出现错误,指定的编码集不对,您目前指定的编码集是:" + charset);
}
}
/**
* md5加密验证(null的参数不会进行加密操作)
*
* @param o 传入对象
* @param key 加密因子
* @param reqMac 加密信息
* @return
*/
public static boolean sign(Object o, String key, String reqMac) {
StringBuilder buffer = new StringBuilder();
try {
Class cls = o.getClass();
Field[] fields = cls.getDeclaredFields();
buffer.append(key);// 获取配置文件中的加密因子
for (int i = 0; i < fields.length; i++) {
Field f = fields[i];
f.setAccessible(true);
if (f.get(o) != null) { // 参数中为Null不会进行加密校验
if (!(f.get(o) instanceof List)) {
buffer.append(f.get(o));
}
}
}
String str = buffer.toString();
String mac = encode(str);// MD5加密并且16位转换
log.info("MD5加签结果为:{}", mac);
return !mac.equalsIgnoreCase(reqMac);// 忽略大小写后的比较
} catch (Exception e) {
return false;
}
}
/**
* MD5加密后16位转换
*
* @param origin
* @return
*/
public static String encode(String origin) {
String resultString = null;
try {
resultString = origin;
MessageDigest md = MessageDigest.getInstance("MD5");
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
} catch (Exception ex) {
ex.getMessage();
}
return resultString;
}
private static String byteArrayToHexString(byte[] b) {
StringBuilder resultSb = new StringBuilder();
for (int i = 0; i < b.length; i++) {
resultSb.append(byteToHexString(b[i]));
}
return resultSb.toString();
}
private static String byteToHexString(byte b) {
int n = b;
if (n < 0)
n = 256 + n;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
/**
* 对map中参数进行加签校验
*
* @param map
* @param key
* @return
*/
public static boolean sign(Map<String, String> map, String key) {
boolean result = false;
if (map.containsKey("sign")) {
String sign = map.get("sign");
map.remove("sign");
StringBuilder buf = new StringBuilder((map.size() + 1) * 10);
SignUtils.buildPayParams(buf, map, false);
String preStr = buf.toString();
log.info("参数加密顺序为:{}", preStr);
String signRecieve = MD5.sign(preStr, "&key=" + key, "utf-8");
log.info("MD5加签结果为:{}", signRecieve);
result = sign.equalsIgnoreCase(signRecieve);
}
return result;
}
public static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString
.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString
.getBytes(charsetname)));
} catch (Exception exception) {
}
return resultString;
}
/**
* 对map中参数进行加签校验
*
* @param map
* @param key
* @return
*/
public static String getSign(Map<String, String> map, String key) {
String signRecieve = "";
if (map.containsKey("sign")) {
String sign = map.get("sign");
map.remove("sign");
StringBuilder buf = new StringBuilder((map.size() + 1) * 10);
SignUtils.buildPayParams(buf, map, false);
String preStr = buf.toString();
log.info("参数加密顺序为:{}", preStr);
signRecieve = MD5.sign(preStr, "&key=" + key, "utf-8");
log.info("MD5加签结果为:{}", signRecieve);
}
return signRecieve;
}
/**
* 对map中参数进行加签校验(消息推送)
*
* @param map
* @param key
* @return
*/
public static String getSignKafka(Map<String, String> map, String key) {
String signRecieve = "";
StringBuilder buf = new StringBuilder((map.size() + 1) * 10);
SignUtils.buildPayParams(buf, map, false);
String preStr = buf.toString();
//log.info("kafka消息推参数加密顺序为:{}", preStr);
signRecieve = MD5.sign(preStr, "&key="+key, "utf-8");
//log.info("kafka消息推MD5加签结果为:{}", signRecieve);
return signRecieve;
}
/**
* 对map中参数进行加盐加签校验(消息推送)
*
* @param appSign
* @param appId
* @return
*/
public static String getSignKafkaAppSign(String appSign, String key) {
String signRecieve = "";
log.info("晓得加盐加签加密顺序为:{}", appSign);
signRecieve = MD5.sign(appSign, "&key="+key, "utf-8");
log.info("晓得加盐加签MD5加签结果为:{}", signRecieve);
return signRecieve;
}
}
MD5Util
最新推荐文章于 2025-04-20 23:53:20 发布