/*
* MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法。
* 信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度的哈希值。
MessageDigest 对象开始被初始化。
* 在调用 digest 之后,MessageDigest 对象被重新设置成其初始状态。
*
* MessageDigest类也是一个工厂类,其构造器是受保护的,不允许
直接使用new MessageDigist( )来创建对象,而必须通过其静态方法getInstance( )生成MessageDigest对象。
其中传入的参数指定计算消息摘要所使用的算法,常用的有"MD5","SHA"等。
update 传入的参数是字节类型或字节类型数组,对于字符串,需要先使用 getBytes( ) 方法生成字符串数组。
*/
public class MD5Util {
//以16进制进行转换
private static final String hexDigits[] = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
/**
* @param b 完成哈希计算得到的byte[] 数组
*/
private static String byteArrayToHexString(byte b[]) {
StringBuffer resultSb = new StringBuffer();
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;
int d1 = n / 16;
int d2 = n % 16;
return hexDigits[d1] + hexDigits[d2];
}
/**
*
* @param origin 需要加密的内容
* @param charsetname 指定字符集
*/
public static String MD5Encode(String origin, String charsetname) {
String resultString = null;
try {
resultString = new String(origin);
MessageDigest md = MessageDigest.getInstance("MD5");//创建MessageDigest对象
if (charsetname == null || "".equals(charsetname))
resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
else
resultString = byteArrayToHexString(md.digest(resultString.getBytes(charsetname)));//使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
} catch (Exception exception) {
}
return resultString;
}
}
public class MD5Test {
public final static String md5(String s){
//以16进制进行转换
char[] hexDigits={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
try{
//将字符创变为字节数组
byte[] strTemp = s.getBytes();
//创建MessageDigest对象
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
//使用strTemp字节数组更新mdTemp摘要
mdTemp.update(strTemp);
//通过填充之类的相关操作完成哈希计算
byte[] digest = mdTemp.digest();
System.out.println("byte[] digest: "+Arrays.toString(digest));
// 得到哈希算法之后的长度
int j=digest.length;
//创建一个新的字符数组,长度为digest的两倍,用于创建新的字符串
char[] newChar=new char[2*j];
for(int i=0,k=0;i<j;i++){
byte b=digest[i];
newChar[k++]=hexDigits[b>>>4&0xf];//奇数位的位运算
newChar[k++]=hexDigits[b&0xf];//偶数位的位运算
}
//返回一个新的字符串
return new String(newChar);
}catch(Exception e){
return null;
}
}
public static void main(String[] args) {
String md5 = MD5Test.md5("b");
System.out.println("md5: "+md5);
//第1次输出值 md5: 92eb5ffee6ae2fec3ad71c777531578f
//第2次输出值 md5: 92eb5ffee6ae2fec3ad71c777531578f
//从这里看出 值不是随意生成的,给定更新数据,则每次生成的值都一样
}
}
public class MD5 {
public static String md5(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes());//更新md摘要
byte b[] = md.digest();//完成哈希计算
StringBuffer buf = new StringBuffer("");
for (int offset = 0, i=0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;//java中的byte类型的取值范围是-128~127
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));// 以十六进制(基数 16)无符号整数形式返回一个整数参数的字符串表示形式。
}
str = buf.toString();
} catch (Exception e) {
e.printStackTrace();
}
return str;
}
public static void main(String[] args) {
System.out.println(md5("31119@qq.com"+"123456"));
System.out.println(md5("mj1"));
System.out.println(md5("gaozhen"));
}
}