package com.cmcc.hybj.payment.framework.crypt;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.apache.shiro.crypto.hash.Md5Hash;
import com.google.common.base.Joiner;
/**
* MD5Util
*
* @author gy
*/
public class MD5Util {
/**
* 通过MD5算法加密;
*
* @param pwd
*/
public static String encoder(String pwd) {
StringBuffer sb = new StringBuffer();
try {
//1指定算法类型;
MessageDigest digest = MessageDigest.getInstance("MD5");
//2将需要加密的字符串转换成byte数组;
byte[] bs = digest.digest(pwd.getBytes());
//3通过遍历bs 生成32位的字符串;
//最后字符串有个拼接的过程;
for (byte b : bs) {
int i = b & 0xff; //int 类型的i 是4个字节占32位;
//int 类型的i转换成16进制字符;
String hexString = Integer.toHexString(i);
if (hexString.length() < 2) {//补零的过程,因为生成的时候有的是一位有的是两位所以需要有个补零的过程;
hexString = "0" + hexString;
}
sb.append(hexString);
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {//找不到指定算法的错误;
e.printStackTrace();
}
return sb.toString();
}
/**
* 增加的MD5加密 可以用于
* shiro的md5加密
*
* @param str 源字符串
* @param salt 盐
* @param num 随机数
* @return md5Str
*/
public static String superMd5(String str, String salt, int num) {
return new Md5Hash(str, salt, num).toString();
}
/**
* 将指定的字符串用MD5算法加密
*
* @param inStr 源字符串
* @return 返回加密后的字符串(默认英文大写)
*/
public static String string2MD5(String inStr) {
MessageDigest md5 = null;
try {
md5 = MessageDigest.getInstance("MD5");
byte[] md5Bytes = md5.digest(inStr.getBytes());
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().toUpperCase();
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
/**
* 将字符串数组转换为字符串后进行加密
*
* @param strArray
* @return
*/
public static String array2MD5(String[] strArray) {
String linkStr = Joiner.on("").join(strArray);
return string2MD5(linkStr);
}
/**
* 对给出的String数组进行MD5校验
*
* @param strArray
* @param md5Val
* @return
*/
public static Boolean macValidate(String[] strArray, String md5Val) {
String iVal = array2MD5(strArray);
if (iVal.equals(md5Val)) {
return true;
}
return false;
}
/**
* 签名
* @param plainText
* @param enc
* @return
*/
public static String MD5(String plainText, String enc) {
String md5 = new String();
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes(enc));
byte[] b = md.digest();
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0){
i += 256;
}
if (i < 16){
buf.append("0");
}
buf.append(Integer.toHexString(i));
}
md5 = buf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return md5;
}
}