(学习笔记)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;
}
}
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;
}
}
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序