MD5是常用的加密算法,也经常用于校验信息完整,如文件的完整性。用术语讲,MD5是一种消息摘要算法(Message Digest Algorithm)。另外还有一种常用的消息摘要算法SHA1。如果想了解这些的话,可以去百度百科:MD5、SHA1、消息摘要算法。

Java已经实现了MD5、SHA1算法。利用java.security.MessageDigest类就可以获取字符串和文件的MD5以及SHA1结果。

1.字符串的MD5(下面的代码有详细注释)

public static String stringMD5(String input) {

  try {

     // 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)

     MessageDigest messageDigest =MessageDigest.getInstance("MD5");

     // 输入的字符串转换成字节数组

     byte[] inputByteArray = input.getBytes();

     // inputByteArray是输入字符串转换得到的字节数组

     messageDigest.update(inputByteArray);

     // 转换并返回结果,也是字节数组,包含16个元素

     byte[] resultByteArray = messageDigest.digest();

     // 字符数组转换成字符串返回

     return byteArrayToHex(resultByteArray);

  } catch (NoSuchAlgorithmException e) {

     return null;

  }
}
//下面这个函数用于将字节数组换成成16进制的字符串

public static String byteArrayToHex(byte[] byteArray) {

  // 首先初始化一个字符数组,用来存放每个16进制字符

  char[] hexDigits = {'0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F' };

  // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))

  char[] resultCharArray =new char[byteArray.length * 2];

  // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去

  int index = 0;

  for (byte b : byteArray) {

     resultCharArray[index++] = hexDigits[b>>> 4 & 0xf];

     resultCharArray[index++] = hexDigits[b& 0xf];

  }

  // 字符数组组合成字符串返回

  return new String(resultCharArray);
}

从上面代码可以看出,使用MessageDigest对字符串进行MD5算法的步骤是,先将字符串转换成字节数组,在进行MD5算法,最后返回的也是一个字节数组,要我们自己转成32位的字符串。

2.文件MD5

对文件进行MD5也可以像字符串MD5一样的,首先要把文件转成字节数组,后面和字符串MD5完全一样。

但是如果是一个特别大的文件,一下子把一个文件的数组全部读到内存中,那么估计内存也吃不消。

对于大文件,可以使用DigestInputStream。

public static String fileMD5(String inputFile) throws IOException {

  // 缓冲区大小(这个可以抽出一个参数)

  int bufferSize = 256 * 1024;

  FileInputStream fileInputStream = null;

  DigestInputStream digestInputStream = null;

  try {

     // 拿到一个MD5转换器(同样,这里可以换成SHA1)

     MessageDigest messageDigest =MessageDigest.getInstance("MD5");

     // 使用DigestInputStream

     fileInputStream = new FileInputStream(inputFile);

     digestInputStream = new DigestInputStream(fileInputStream,messageDigest);

     // read的过程中进行MD5处理,直到读完文件

     byte[] buffer =new byte[bufferSize];

     while (digestInputStream.read(buffer) > 0);

     // 获取最终的MessageDigest

     messageDigest= digestInputStream.getMessageDigest();

     // 拿到结果,也是字节数组,包含16个元素

     byte[] resultByteArray = messageDigest.digest();

     // 同样,把字节数组转换成字符串

     return byteArrayToHex(resultByteArray);

  } catch (NoSuchAlgorithmException e) {

     return null;

  } finally {

     try {

        digestInputStream.close();

     } catch (Exception e) {

     }

     try {

        fileInputStream.close();

     } catch (Exception e) {

     }

  }
}

上面的方法本人亲测过大小约4G的文件,得出的MD5值和网上下载的一个MD5小工具得到的MD5值一样,说明上面的方式没有什么问题。不过取大文件的MD5很慢,4G的文件跑一下要一分钟(I5处理器 6G内存 64位XP系统 本本)。

附1:我在网上还看到一种给文件MD5的方式

public static String getFileMD5String(File file) throws IOException {
FileInputStream in = new FileInputStream(file);
FileChannel ch = in.getChannel();
MappedByteBuffer byteBuffer = ch.map(FileChannel.MapMode.READ_ONLY, 0,
file.length());
messagedigest.update(byteBuffer);
return byteArrayToHex(messagedigest.digest());
}

我也尝试过这样的方式,但是如果文件大于2G,那么这种方式会出现异常。所以不推荐。

附2:测试文件MD5的main方法

public static void main(String[] args) {

        long startTime = System.currentTimeMillis();

        try {
System.out
.println(fileMD5("E:/软件/VS2008ProEdition90DayTrialCHSX1435983.iso"));
} catch (IOException e) {
e.printStackTrace();
} long endTime = System.currentTimeMillis(); System.out.println((endTime - startTime) / 1000);
}

转自:https://my.oschina.net/shootercn/blog/159839

更多java加密算法可参考常用加密算法的Java实现总结(一),常用加密算法的Java实现总结(二)

Java利用MessageDigest提供的MD5算法加密字符串或文件的更多相关文章

  1. linux md5 加密字符串和文件方法

    linux md5 加密字符串和文件方法 MD5算法常常被用来验证网络文件传输的完整性,防止文件被人篡改.MD5全称是报文摘要算法(Message-Digest Algorithm 5),此算法对任意 ...

  2. 使用Java中间MessageDigest该文本MD5加密(Java中间MD5样品加密算法演示)

    原文地址:http://www.wenboxz.com 版权声明:本文博客原创文章,博客,未经同意,不得转载.

  3. [转]java利用AES实现URL的参数加密

    原文地址:http://h5566h.iteye.com/blog/1465426 很多时候需要在URL传参,希望URL参数能够加密,这里我结合了文章http://www.2cto.com/kf/20 ...

  4. oracle数据库中存储过程使用MD5算法加密

    一.技术点 1. DBMS_OBFUSCATION_TOOLKIT.MD5 DBMS_OBFUSCATION_TOOLKIT.MD5是MD5编码的数据包函数,但偶在使用select DBMS_OBFU ...

  5. 【Java笔试】OYO校招Java工程师|牛客平台,算法:字符串翻转。附选择题解析

    文章目录 1.Java笔试算法题:字符串翻转 2.单选题: 2.1.同一进程下的多个线程可以共享哪一种资源:data section 2.2.一个树形的叶结点在前序遍历和后序遍历下,可以相同的相对位置 ...

  6. LoadRunner中调用SHA1算法加密字符串

    参考<SHA-1 hash for LoadRunner>: http://ptfrontline.wordpress.com/2010/03/02/sha-1-hash-for-load ...

  7. java递归方法查找某目录下包含有某字符串的文件

    最近在安装mysql5.6的时候,因为是免安装版的所以有些配置项需要手动配置.但是配置某一项的时候(例如:max_allowed_packet=xxxxx),不知道max_allowed_packet ...

  8. 消息摘要java.security.MessageDigest

    这是一种与消息认证码结合使用以确保消息完整性的技术.主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4.MD5.SHA-1,jdk1.5对 ...

  9. 我的Java开发学习之旅------>工具类:Java获取字符串和文件进行MD5值

    ps:这几天本人用百度云盘秒传了几部大片到云盘上,几个G的文件瞬秒竟然显示"上传成功"!这真让我目瞪口呆,要是这样的话,那得多快的网速,这绝对是不可能的,也许这仅是个假象.百度了一 ...

随机推荐

  1. 在JSP页面下使用AJAX实现用户名存在的检测

    <script type="text/javascript">     function init(){         document.getElementById ...

  2. 学霸网站之NABCD

    1.需求(Need) 随着社会的发展,互联网产业得到了飞速的发展,如今,互联网在各个领域都取得了至关重要的作用,随之而来的数量庞大的数据也让我们每个人在学习生活中倍感压力,如何才能在这些数据中找到自己 ...

  3. 全国信息学奥林匹克联赛(NOIP2014)复赛 模拟题Day2 长乐一中

    题目名称 改造二叉树 数字对 交换 英文名称 binary pair swap 输入文件名 binary.in pair.in swap.in 输出文件名 binary.out pair.out sw ...

  4. 51nod 最大子矩阵和(动态规划)

    最大子矩阵和 一个M*N的矩阵,矩阵中有一些整数(有正有负),找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值. 输入 第1行:M和N,中间用空格隔开(2 <= M,N ...

  5. 黑马程序员——JAVA基础之简述多线程,两种创建多线程的方式

    ------- android培训.java培训.期待与您交流! ---------- 多线程: 进程和线程: 进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者 ...

  6. 恢复Ext3下被删除的文件(转)

    恢复Ext3下被删除的文件(转) 前言 下面是这个教程将教你如何在Ext3的文件系统中恢复被rm掉的文件. 删除文件 假设我们有一个文件名叫 ‘test.txt’ $ls -il test.txt 1 ...

  7. C#中有关string和byte[]转换的问题

    byte[] byteArray = System.Text.Encoding.Default.GetBytes( str ); 怎么样,够简单吧? 反过来也是一样,把byte[]转成string: ...

  8. 2.Nexus更新索引

    1.手动更新1.  下载索引文件在http://repo.maven.apache.org/maven2/.index/ 中下载nexus-maven-repository-index.gznexus ...

  9. webpack es6支持配置

    Install Babel and the presets: npm install --save-dev babel-core babel-preset-es2015 Install babel-l ...

  10. 【转】HTML - embed 与 object 之争

    在 HTML 里嵌入文本和图片之外的事物,就会用到嵌入标签,而嵌入标签在各浏览器之间的不统一,一直是让开发人员很头痛的问题.一切都要从嵌入 SUN 公司的 Applet Java 小程序开始. 当时, ...