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. Json学习篇

      JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行 ...

  2. Qt Creator调试

    与调试器交互的几种方法: 1.单行运行或者单指令运行 2.中断程序运行 3.设置断点 4.检查调用栈空间的内容 5.检查并修改局部或者全局变量 6.检查并修改被调试程序的寄存器和内存内容 7.检查装载 ...

  3. java编程之:Unsafe类

    Unsafe类在jdk 源码的多个类中用到,这个类的提供了一些绕开JVM的更底层功能,基于它的实现可以提高效率.但是,它是一把双刃剑:正如它的名字所预示的那样,它是 Unsafe的,它所分配的内存需要 ...

  4. freeswitch 1.4

    yum install git gcc-c++ autoconf automake libtool wget python ncurses-devel zlib-devel libjpeg-devel ...

  5. Linux信号量详解

    1.什么是信号量信号量是一种特殊的变量,访问具有原子性.只允许对它进行两个操作:1)等待信号量当信号量值为0时,程序等待:当信号量值大于0时,信号量减1,程序继续运行.2)发送信号量将信号量值加1. ...

  6. linux ascii艺术与ansi艺术

    Linux终端下的ASCII艺术 http://zh.wikipedia.org/zh-tw/%E9%9B%BB%E5%AD%90%E9%81%8A%E6%88%B2%E5%8F%B2 电子游戏史 h ...

  7. SqlServer中日期和时间数据类型及函数 【转】

    来源:http://blog.csdn.net/royalwzy/article/details/6446075 日期和时间数据类型 下表列出了 Transact-SQL 的日期和时间数据类型. 数据 ...

  8. Git服务器搭建及SSH无密码登录设置

    在Git服务器中建立一个git帐号,用于多人使用. adduser git输入此命令后,会在/home/下建立一个git文件 /home/git 下建立.ssh目录(注意,是.ssh..有个点!) c ...

  9. Centos7下配置Tomcat7以指定(非root)身份运行

    通常情况下,在配置Tomcat生产环境时,通常会配置Tomcat以特定的身份运行(非root),这样有利于提高安全性,防止网站被黑后的进一步权限提升. 本文依赖的环境: Ubuntu(其实大部分同样适 ...

  10. oracle ORA-01747(系统保留关键字)user.table.column, table.column 或列说明无效 hibernate映射oracle保留关键字

    1.查询系统关键 select * from v$reserved_words 确认你使用的是否为关键字: select * from v$reserved_words w where w.KEYWO ...