我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java关于MD5文件校验

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java关于MD5文件校验

文章目录

前言

JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现。获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过MessageDigest类进行MD5加密,第三步转换成16进制的MD5码值。

什么是MD5算法

MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash value),用于确保信息传输完整一致。

原理

MD5是一种不可逆的算法,是一种散列函数,使用的是hash算法。输入任意长度的信息,经过处理,输出为128位的信息(数字指纹),不同的输入得到的不同的结果(唯一性)。
在计算过程中原文的部分信息是丢失了的。所以不能从密文(散列值)反过来得到原文,即没有解密算法。

MD5相当于超损压缩。

MD5用途

1.防止被篡改:
1)比如发送一个电子文档,发送前,我先得到MD5的输出结果a。然后在对方收到电子文档后,对方也得到一个MD5的输出结果b。如果a与b一样就代表中途未被篡改。
2)比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的MD5输出结果。
3)SVN在检测文件是否在CheckOut后被修改过,也是用到了MD5.

2.防止直接看到明文:
现在很多网站在数据库存储用户的密码的时候都是存储用户密码的MD5值。这样就算不法分子得到数据库的用户密码的MD5值,也无法知道用户的密码。(比如在UNIX系统中用户的密码就是以MD5(或其它类似的算法)经加密后存储在文件系统中。当用户登录的时候,系统把用户输入的密码计算成MD5值,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这不但可以避免用户的密码被具有系统管理员权限的用户知道,而且还在一定程度上增加了密码被破解的难度。)

3.防止抵赖(数字签名):
这需要一个第三方认证机构。例如A写了一个文件,认证机构对此文件用MD5算法产生摘要信息并做好记录。若以后A说这文件不是他写的,权威机构只需对此文件重新产生摘要信息,然后跟记录在册的摘要信息进行比对,相同的话,就证明是A写的了。这就是所谓的“数字签名”。

MD5安全性

普遍认为MD5是很安全,因为暴力破解的时间是一般人无法接受的。实际上如果把用户的密码MD5处理后再存储到数据库,其实是很不安全的。因为用户的密码是比较短的,而且很多用户的密码都使用生日,手机号码,身份证号码,电话号码等等。或者使用常用的一些吉利的数字,或者某个英文单词。如果我把常用的密码先MD5处理,把数据存储起来,然后再跟你的MD5结果匹配,这时我就有可能得到明文。比如某个MD5破解网站http://www.cmd5.com/default.aspx,所以现在大多数网站密码的策略是强制要求用户使用数字大小写字母的组合的方式提高用户密码的安全度。

方法

方法一

较为原始,将文件一次性读入内存,然后通过MessageDigest进行MD5加密,最后再手动将其转换为16进制的MD5值。

private final static String[] strHex = { "0", "1", "2", "3", "4", "5",            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };    public static String getMD5One(String path) {        StringBuffer sb = new StringBuffer();        try {            MessageDigest md = MessageDigest.getInstance("MD5");            byte[] b = md.digest(FileUtils.readFileToByteArray(new File(path)));            for (int i = 0; i < b.length; i++) {                int d = b[i];                if (d < 0) {                    d += 256;                }                int d1 = d / 16;                int d2 = d % 16;                sb.append(strHex[d1] + strHex[d2]);            }        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return sb.toString();    }

方法二

借助了Integer类的方法实现16进制的转换,比方法一更简洁一些。PS:JAVA中byte是有负数的,代码中&0xff的操作与计算机中数据存储的原理有关,即负数存储的是二进制的补码。

public static String getMD5Two(String path) {        StringBuffer sb = new StringBuffer("");        try {            MessageDigest md = MessageDigest.getInstance("MD5");            md.update(FileUtils.readFileToByteArray(new File(path)));            byte b[] = md.digest();            int d;            for (int i = 0; i < b.length; i++) {                d = b[i];                if (d < 0) {                    d = b[i] & 0xff;                    // 与上一行效果等同                    // i += 256;                }                if (d < 16)                    sb.append("0");                sb.append(Integer.toHexString(d));            }        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return sb.toString();    }

方法三

本方法在读入文件信息上有点不同。这里是分多次将一个文件读入,对于大型文件而言,比较推荐这种方式,占用内存比较少。步骤三则是通过BigInteger类提供的方法进行16进制的转换。

public static String getMD5Three(String path) {        BigInteger bi = null;        try {            byte[] buffer = new byte[8192];            int len = 0;            MessageDigest md = MessageDigest.getInstance("MD5");            File f = new File(path);            FileInputStream fis = new FileInputStream(f);            while ((len = fis.read(buffer)) != -1) {                md.update(buffer, 0, len);            }            fis.close();            byte[] b = md.digest();            bi = new BigInteger(1, b);        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return bi.toString(16);    }

方法四

通过调用 字节数组转十六进制字符串的方法 实现(跟方法3差不多)

public static String getMD5Four(String filePath) {        try {            InputStream fis = new FileInputStream(filePath); // FileNotFoundException            MessageDigest md = MessageDigest.getInstance("MD5"); // NoSuchAlgorithmException            byte[] buffer = new byte[1024];            int length = -1;            while ((length = fis.read(buffer, 0, 1024)) != -1) {  // IO exception                md.update(buffer, 0, length);            }            fis.close();            // 转换并返回包含16个元素字节数组,返回数值范围为-128到127            byte[] md5Bytes = md.digest();            // 方法2 使用bigInteger//            BigInteger bigInteger = new BigInteger(1, md5Bytes);//            return bigInteger.toString(16);            // 方法3  使用字节数组转十六进制字符串            String strMd5 = bytesToHexStr(md5Bytes);            return strMd5;        } catch (FileNotFoundException e) {            e.printStackTrace();            return "";        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();            return "";        } catch (IOException e) {            e.printStackTrace();            return "";        }    }        public static String bytesToHexStr(byte[] b) {        StringBuilder strBuilder = new StringBuilder();        String strTemp = "";        for (int n = 0; n < b.length; ++n) {            strTemp = (Integer.toHexString(b[n] & 0XFF));            if (strTemp.length() == 1) {                strBuilder.append("0").append(strTemp);            } else {                strBuilder.append(strTemp);            }        }        return strBuilder.toString();    }

方法五

最简单~
JAVA自带的commons-codec包就提供了获取16进制MD5值的方法。其底层实现上,也是分多次将一个文件读入,类似方法三、四

DigestUtils.md5Hex(new FileInputStream(path));

另外,如何知道自己生成的文件md5值是否正确?

cmd 输入 powershell 切入到powershell面板

certutil -hashfile “./xxx.txt” MD5    # (MD5需大写)

参考文章:

  1. JAVA中获取文件MD5值的四种方法

  2. Java的MessageDigest类、MD5算法

来源地址:https://blog.csdn.net/qq_36256590/article/details/131204076

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java关于MD5文件校验

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

python 文件MD5 SHA1校验计

#coding: GBK#md5SHA1文件校验值计算#使用方法: python 文件.py  验证文件import hashlibimport sysimport osdefmd5_sum(filename):     #校验值方法   
2023-01-31

利用Python生成文件md5校验值函数的方法

前言 在linux有个命令叫做md5sum,能生成文件的md5值,一般情况下都会将结果记录到一个文件中用于校验使用,比如会这样使用:[crazyant@localhost PythonMd5]$ more sample_file www.
2022-06-04

大文件下载以及进度条展示和MD5校验

使用socket网络,上传一个视频,大小在3G左右能够显示进度条,显示花费时间下载使用TCP协议server向client发送文件新建文件server.py,代码如下:importosimportjsonimportsocketimport
2023-01-30

如何使用Linux中校验文件的MD5码与SHA1码

本篇内容介绍了“如何使用Linux中校验文件的MD5码与SHA1码”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!md5sum用法:md5su
2023-06-12

关于文件合并与修改md5值的问题

这篇文章主要介绍了关于文件合并与修改md5值的问题,使用本博客的方法,不仅仅可以修改md5值,还可以达到隐藏文件的目的,需要的朋友可以参考下
2023-05-15

关于SpringBoot中controller参数校验的使用

本文主要介绍了关于SpringBoot中controller参数校验的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-01-15

关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验

这篇文章主要介绍了关于SpringBoot的@ConfigurationProperties注解和松散绑定、数据校验,@ConfigurationProperties主要作用就是将prefix属性指定的前缀配置项的值绑定到这个JavaBean上 ,通过指定的前缀,来绑定配置文件中的配置,需要的朋友可以参考下
2023-05-20

Linux命令行进行文件哈希校验

在Linux中,可以使用md5sum或sha256sum命令行工具对文件进行哈希校验以下是使用md5sum和sha256sum命令行工具进行文件哈希校验的示例:使用md5sum命令:md5sum filename这将输出文件的MD5哈希值
Linux命令行进行文件哈希校验
2024-09-24

关于Java反编译字节码文件

将高级语言翻译成汇编语言或机器语言的过程Java语言中的编译一般指将Java文件转换成class文件顾名思义反编译就是编译的逆向过程其实我们常用的开发工具(例如:IDEA、Eclipse)都带有反编译功能,需要的朋友可以参考下
2023-05-19

关于Java从本地文件复制到网络文件上传

这篇文章主要介绍了关于Java从本地文件复制到网络文件上传,File 和 IO 流其实是很相似的,都是将文件从一个地方转移到另一个地方,这也是流的特点之一,需要的朋友可以参考下
2023-05-15

怎么在Win10系统中使用PowerShell校验文件

怎么在Win10系统中使用PowerShell校验文件?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。具体方法如下:1、默认普通验证(SHA256)命令:Get-FileHash
2023-06-13

基于md5的文件完整性检测是怎么样的

这期内容当中小编将会给大家带来有关基于md5的文件完整性检测是怎么样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。md5sum是Linux平台下面用来检测文件完整性的给力工具,维基百科是这样来解释 md
2023-06-06

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录