Java中MD5加密算法的简单剖析

       总所周知,世界上每个人都有独一无二的指纹,而MD5算法可以为每一个文件都生成一个独一无二的数字指纹,Java中是怎样产生这个数字指纹的呢?下面的例子对密码123456进行MD5加密:

package pwd;

import java.security.MessageDigest;

public class TestMD501 {
	public static void main(String[] args) throws Exception {
		String pwd="123456";
		//获取一个基于MD5算法的消息摘要对象
		MessageDigest md=MessageDigest.getInstance("MD5");
		//对字符串进行加密(创建信息摘要)
		byte[] result = md.digest(pwd.getBytes());
		System.out.println(result.length);//16
		StringBuilder builder=new StringBuilder();
		for(int i=0;i<result.length;i++){
			//将字节数组中的内容转换为16进制
			String str = Integer.toHexString(result[i]&0xff);
			if(str.length()==1){
				str="0"+str;
			}
			builder.append(str);
		}
		System.out.println(builder.toString());
	}
}

        输出的结果显示result数组的长度为16,而转换后的结果为e10adc3949ba59abbe56e057f20f883e。程序中首先利用MD5算法的消息摘要对象将需要加密的信息转换为一个16字节的数组,然后遍历数组,将每一个字节转换为两位的十六进制字符串,最后输出的结果就是一个32位的十六进制字符串。Integer.toHexString(result[i]&0xff)这一步是只选取二进制的低八位,然后转换为十六进制。str="0"+str这一步是因为上一步的低八位前四位可能为0,为避免缺位,在这里给只有一位的元素前面添加0,保证最终密码的32位完整性。

       下面的例子是对一个文件进行MD5加密,结果仍然是一个32位的十六进制的字符串,倘若要增加文件的安全性,提高破解的难度,可以加入盐值(salt)进行字符串的拼接。

package pwd;

import java.io.FileInputStream;
import java.io.InputStream;
import java.security.MessageDigest;

public class TestMD502 {
	public static void main(String[] args) throws Exception {
		MessageDigest md=MessageDigest.getInstance("MD5");
		InputStream in=new FileInputStream("src/pwd/TestMD501.java");
		byte[] buf=new byte[in.available()];
		in.read(buf);
		System.out.println(new String(buf));
		byte[] result=md.digest(buf);
		StringBuilder builder=new StringBuilder();
		for(int i=0;i<result.length;i++){
			String str = Integer.toHexString(result[i]&0xff);
			if(str.length()==1){
				str="0"+str;
			}
			builder.append(str);
		}
		System.out.println(builder.toString());
	}
}


猜你喜欢

转载自blog.csdn.net/sunroyfcb/article/details/80727086