package org.hepx.jgt.common.encrypt;
import org.hepx.jgt.common.JgtConstant;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.util.*;
/**
* @author: Koala
* @Date: 14-8-23 下午10:29
* @Version: 1.0
*/
public class MD5 {
private final static Logger logger = LoggerFactory.getLogger(MD5.class);
/**
* @param plainText 需要加密的字符串
* @return
* @Description 字符串加密为MD5
* 中文加密一致通用,必须转码处理:
* plainText.getBytes("UTF-8")
*/
public static String toMD5(String plainText) {
StringBuffer rlt = new StringBuffer();
try {
rlt.append(md5String(plainText.getBytes(JgtConstant.ENCODING)));
} catch (UnsupportedEncodingException e) {
logger.error(" MD5加密出错:", e.toString());
}
return rlt.toString();
}
/**
* MD5 参数签名生成算法
* @param params 请求参数集,所有参数必须已转换为字符串类型
* @param secret 签名密钥
* @return 签名
* @throws java.io.IOException
*/
public static String getSignature(HashMap<String, String> params, String secret) throws IOException {
Map<String, String> sortedParams = new TreeMap<String, String>(params);
Set<Map.Entry<String, String>> entrys = sortedParams.entrySet();
StringBuilder basestring = new StringBuilder();
for (Map.Entry<String, String> param : entrys) {
basestring.append(param.getKey()).append("=").append(param.getValue());
}
basestring.append(secret);
byte[] bytes = md5Raw(basestring.toString().getBytes(JgtConstant.ENCODING));
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);
}
return sign.toString();
}
public static byte[] md5Raw(byte[] data) {
byte[] md5buf = null;
try {
MessageDigest md5 = MessageDigest.getInstance("md5");
md5buf = md5.digest(data);
} catch (Exception e) {
md5buf = null;
e.printStackTrace(System.err);
}
return md5buf;
}
public static String md5String(byte[] data) {
String md5Str = null;
try {
MessageDigest md5 = MessageDigest.getInstance("md5");
md5Str = "";
byte[] buf = md5.digest(data);
for (int i = 0; i < buf.length; i++) {
md5Str += byte2Hex(buf[i]);
}
} catch (Exception e) {
md5Str = null;
e.printStackTrace(System.err);
}
return md5Str;
}
public static String byte2Hex(byte b) {
String hex = Integer.toHexString(b);
if (hex.length() > 2) {
hex = hex.substring(hex.length() - 2);
}
while (hex.length() < 2) {
hex = "0" + hex;
}
return hex;
}
public static String byte2Hex(byte[] bytes) {
Formatter formatter = new Formatter();
for (byte b : bytes) {
formatter.format("%02x", b);
}
String hash = formatter.toString();
formatter.close();
return hash;
}
}