代码实现:

  1. import java.io.File;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.security.MessageDigest;
  5. public class MD5Util {
  6. static char hexdigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
  7. /**
  8. * @funcion 对文件全文生成MD5摘要
  9. * @param file:要加密的文件
  10. * @return MD5摘要码
  11. */
  12. public static String getMD5(File file) {
  13. FileInputStream fis = null;
  14. try {
  15. MessageDigest md = MessageDigest.getInstance("MD5");
  16. fis = new FileInputStream(file);
  17. byte[] buffer = new byte[2048];
  18. int length = -1;
  19. while ((length = fis.read(buffer)) != -1) {
  20. md.update(buffer, 0, length);
  21. }
  22. byte[] b = md.digest();
  23. return byteToHexString(b);
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. return null;
  27. } finally {
  28. try {
  29. fis.close();
  30. } catch (IOException e) {
  31. e.printStackTrace();
  32. }
  33. }
  34. }
  35. /**
  36. * @function 把byte[]数组转换成十六进制字符串表示形式
  37. * @param tmp  要转换的byte[]
  38. * @return 十六进制字符串表示形式
  39. */
  40. private static String byteToHexString(byte[] tmp) {
  41. String s;
  42. // 用字节表示就是 16 个字节
  43. // 每个字节用 16 进制表示的话,使用两个字符,所以表示成 16 进制需要 32 个字符
  44. // 比如一个字节为01011011,用十六进制字符来表示就是“5b”
  45. char str[] = new char[16 * 2];
  46. int k = 0; // 表示转换结果中对应的字符位置
  47. for (int i = 0; i < 16; i++) { // 从第一个字节开始,对 MD5 的每一个字节转换成 16 进制字符的转换
  48. byte byte0 = tmp[i]; // 取第 i 个字节
  49. str[k++] = hexdigits[byte0 >>> 4 & 0xf]; // 取字节中高 4 位的数字转换, >>> 为逻辑右移,将符号位一起右移
  50. str[k++] = hexdigits[byte0 & 0xf]; // 取字节中低 4 位的数字转换
  51. }
  52. s = new String(str); // 换后的结果转换为字符串
  53. return s;
  54. }
  55. public static void main(String arg[]) {
  56. String a = getMD5(new File("e:/a.txt"));
  57. String b = getMD5(new File("e:/b.txt"));
  58. String c = getMD5(new File("e:/c.txt"));
  59. System.out.println("a.txt的摘要值为:" + a);
  60. System.out.println("b.txt的摘要值为:" + b);
  61. System.out.println("c.txt的摘要值为:" + c);
  62. if(a.equals(b)) {
  63. System.out.println("a.txt中的内容与b.txt中的内容一致");
  64. } else {
  65. System.out.println("a.txt中的内容与b.txt中的内容不一致");
  66. }
  67. if(a.equals(c)) {
  68. System.out.println("a.txt中的内容与c.txt中的内容一致");
  69. } else {
  70. System.out.println("a.txt中的内容与c.txt中的内容不一致");
  71. }
  72. }
  73. }

运行之前建立文件:

在E盘根目录下建立a.txt、b.txt和c.txt。

a.txt中的内容为“123456”。

b.txt中的内容为“123456”。

c.txt中的内容为“654321”。

运行结果:

a.txt的摘要值为:c4ca4238a0b923820dcc509a6f75849b

b.txt的摘要值为:e10adc3949ba59abbe56e057f20f883e

c.txt的摘要值为:c33367701511b4f6020ec61ded352059

a.txt中的内容与b.txt中的内容不一致

a.txt中的内容与c.txt中的内容不一致

结论:

从代码本身和运行结果都可以看出,MD5对文件的加密是加密文件中的内容,不管文件名是什么,相同的文件内容经过MD5算法处理后得到的摘要值也相同。

Java实现文件MD5加密的更多相关文章

  1. Java 语言实现 MD5 加密

    Java 语言实现 MD5 加密 背景说明 在实际项目中,为了安全性考虑,经常要求账号密码是以加密后的密文形式,保存到数据库中. 这样,即使有人获取到了数据库中的密文密码,也不知道明文密码信息是什么, ...

  2. Java 自带MD5加密 Demo

    package demo; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; pub ...

  3. Java中使用MD5加密的简单实现

    import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorith ...

  4. java 短连接+MD5加密短链接

    java 短连接+MD5加密短链接 import java.security.MessageDigest; public class ShotUrlUtil { public static void ...

  5. 通过java语言实现MD5加密

    通过java语言实现MD5加密public static String getMd5(String str) { try { MessageDigest md5 = MessageDigest.get ...

  6. Java实现文件的加密与解密

    最近在做一个项目,需要将资源文件(包括图片.动画等类型)进行简单的加密后再上传至云上的服务器,而在应用程序中对该资源使用前先将读取到的文件数据进行解密以得到真正的文件信息.此策略的原因与好处是将准备好 ...

  7. password、文件MD5加密,passwordsha256、sha384、sha512Hex等加密

    package encryption; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io. ...

  8. java中使用MD5加密技术

    在项目中经常会对一些信息进行加密,现在常用的信息加密技术有:MD5.RSA.DES等,今天主要说一下,md5加密,以及如何在java代码根据自己的业务需求使用md5. MD5简介: MD5即Messa ...

  9. java后端制作MD5加密

    由于一次业务的需要,我制作了一次密码的修改子业务. 当用户忘记密码的情况下,我需要动态的发给他一个6位的随机密码,通过即时通,短信,微信等.并同时修改数据库中的原密码为这6位的随机密码.让用户再去修改 ...

随机推荐

  1. python 函数的几个属性 func_name, func_code等

    直接见代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Time : 2018/07/25 10:14 def add(x=0, y=1): & ...

  2. bzoj 3295 CDQ求动态逆序对

    #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...

  3. JavaScript中字符串分割函数split用法实例

    这篇文章主要介绍了JavaScript中字符串分割函数split用法,实例分析了javascript中split函数操作字符串的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了JavaSc ...

  4. android ListView 在初始化时多次调用getView()原因分析

    今天在做一个功能:在初始化ListView时,把第一行背景置为黄色,同时保存第一行对象,用于在点击其他行时将该行重新置为白色. if(position==0){ convertView.setBack ...

  5. 【转载】关于Android RecyclerView的那些开源LayoutManager

    原文地址:http://blog.coderclock.com/2017/03/26/android/%E5%85%B3%E4%BA%8EAndroid%20RecyclerView%E7%9A%84 ...

  6. (8)go 字符串

    内建函数在 包中 1. len(str) 计算长度,中文占3个字符 2.字符串遍历,同时处理中文 package main import ( "fmt" ) func main() ...

  7. 51使用while进行延时的问题

    上周写了一个简单的IO口翻转的程序,但是很奇怪,在FPGA板子上怎么也跑不起来. 后面发现问题可能出在延时函数上. void Delay(unsigned char t) { while(--t); ...

  8. js实现杨辉三角

    杨辉三角是计算二项式乘方展开式的系数时必不可少的工具.是由数字排列而成的三角形数表. 资料:杨辉三角第n行的第1个数为1,第二个数为1×(n-1),第三个数为1×(n-1)×(n-2)/2,第四个数为 ...

  9. 中国石油大学(华东)暑期集训--二进制(BZOJ5294)【线段树】

    问题 C: 二进制 时间限制: 1 Sec  内存限制: 128 MB提交: 8  解决: 2[提交] [状态] [讨论版] [命题人:] 题目描述 pupil发现对于一个十进制数,无论怎么将其的数字 ...

  10. 线程间操作无效: 从不是创建控件“textBox2”的线程访问它

    如何:对 Windows 窗体控件进行线程安全调用 线程间操作无效: 从不是创建控件的线程访问它的三种方法 如果使用多线程处理来提高 Windows 窗体应用程序的性能,则你必须确保以线程安全的方式调 ...