您的位置:首页 > 编程语言 > Java开发

(学习笔记)Java Message Digest Algorithm MD5

2016-09-18 21:29 537 查看

Message Digest Algorithm MD5(中文名为:消息摘要算法第五版):为计算机安全领域广泛使用的一种散列函数,用以提供消息的完整性保护。

以下为Java语言的MD5实现,直接使用MessageDigest类,简单易用,效率高,比自己写算法好的多。

package md5;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Md5Test
{
public static void main(String[] args)
{
//加密admin字符串
System.out.println(byStrMd5("admin"));
//加密ISO文件,这里测试的文件500M,大约需要1.3秒左右
System.out.println(byFileToMd5("DEEPBBS_GHOST_XP_SP3_2012.08.iso"));
}

/**
* 加密文件MD5,提高IO效率,用NIO处理大文件
* **/
public static String byFileToMd5(String fileName)
{
try
{
File file = new File(fileName);
if(!file.exists()) return null;
FileInputStream fis = new FileInputStream(file);
//获取文件引导
FileChannel channel = fis.getChannel();
//创建内存映射
MappedByteBuffer mbb = channel.map(FileChannel.MapMode.READ_ONLY, 0, file.length());
//MD5加密
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(mbb);
//通过反射嗲用cleaner方法,释放内存映射资源
channel.close();
fis.close();
Method m = mbb.getClass().getMethod("cleaner");
m.setAccessible(true);
sun.misc.Cleaner cleaner = (sun.misc.Cleaner) m.invoke(mbb);
cleaner.clean();
cleaner.clear();
//返回16进制字符串
return to16(md5.digest());

} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e){
e.printStackTrace();
} catch (NoSuchAlgorithmException e){
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}

return null;
}

/**
* 将字节byte转换为16进制字符串输出
* */
public static String to16(byte [] b)
{
StringBuffer result = new StringBuffer();
for(int i = 0;i<b.length;i++)
{
if((b[i] & 0xff)<0x10)
{
result.append("0");
}
result.append(Long.toString(b[i] & 0xff, 16));
}
return result.toString().toUpperCase();
}

/**
* MD5加密字符串
* **/
public static String byStrMd5(String src)
{
try
{
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(src.getBytes());
return to16(md5.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
return null;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息