总所周知,世界上每个人都有独一无二的指纹,而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()); } }