java 文件checksum_计算文件Checksum的几种方法
回忆一下,自己是否在网站上下载文件时看到过Checksum这个东西,一串字符串?
比如,我们到Apache网站上去下载用于操作Excel的依赖包 - Apache POI,就可以看到checksum:SHA-256, SHA-512, 如下图所示:
以poi-bin-4.1.0-20190412.tar.gz文件为例,点击SHA-256和SHA-512的链接查看相关的值如下:
##SHA-256的值d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bb##SHA-512的值87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9
本文将简单介绍一下checksum(含义,作用)以及如何使用java程序计算出不同算法的checksum值,包括MD5、SHA-1,SHA-256以及SHA-512。Checksum:总和检验码,校验和。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可
以是数字或在计算检验总和过程中看作数字的其它字符串。通常是以十六进制为数制表示的形式。
【作用】就是用于检查文件完整性,检测文件是否被恶意篡改,比如文件传输(如插件、固件升级包等)场景使用。
接下来,我们一起看下怎么使用java程序产生相关的checksum值,本文以文件poi-bin-4.1.0-20190412.tar.gz为例,具体可以通过如下路径下载:http://mirror.bit.edu.cn/apache/poi/release/bin/poi-bin-4.1.0-20190412.tar.gz
因为要使用不同算法的checksum值,包括MD5、SHA-1,SHA-256以及SHA-512,先定义一个枚举类,用于区分不同的算法。package com.wangmengjun.tutorial.checksum;
public enum CheckSumAlgoType {
MD5("MD5"), SHA_256("SHA-256"), SHA_512("SHA-512"), SHA_1("SHA1");
private String name;
private CheckSumAlgoType(String name) {
this.name = name;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
}
接下来,我们就来看看几种计算文件checksum的方法:使用java.security.MessageDigest
使用org.apache.commons.codec.digest.DigestUtils
使用com.google.common.io.Files.hash
一、使用java.security.MessageDigestpublic static String genChecksum1(File file, String checkSumAlgo) throws NoSuchAlgorithmException, IOException {
MessageDigest messageDigest = MessageDigest.getInstance(checkSumAlgo);
messageDigest.update(Files.readAllBytes(file.toPath()));
byte[] digestBytes = messageDigest.digest();
StringBuffer sb = new StringBuffer();
for (byte b : digestBytes) {
sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
其中,下面的这段代码,StringBuffer sb = new StringBuffer();
for (byte b : digestBytes) {
sb.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
可以使用javax.xml.bind.DatatypeConverter的方法来做,简化后的代码如下:public static String genChecksum1(File file, String checkSumAlgo) throws NoSuchAlgorithmException, IOException {
MessageDigest messageDigest = MessageDigest.getInstance(checkSumAlgo);
messageDigest.update(Files.readAllBytes(file.toPath()));
byte[] digestBytes = messageDigest.digest();
return DatatypeConverter.printHexBinary(digestBytes).toLowerCase();
} 因为,DatatypeConverter.printHexBinary(digestBytes)返回的字符大写,所以添加了toLowerCase()方法保持其一致性。
二、使用org.apache.commons.codec.digest.DigestUtils
使用commons-codec来完成,Maven工程需要添加依赖包,如:
commons-codec
commons-codec
1.13
简单代码如下,通过调用类DigestUtils的静态方法完成指定checksum的计算即可:public static String genChecksum2(File file, CheckSumAlgoType checkSumAlgoType) throws FileNotFoundException, IOException {
/** * 使用org.apache.commons.codec.digest.DigestUtils */
String checksum = null;
switch (checkSumAlgoType) {
case MD5:
checksum = DigestUtils.md5Hex(new FileInputStream(file));
break;
case SHA_1:
checksum = DigestUtils.sha1Hex(new FileInputStream(file));
break;
case SHA_256:
checksum = DigestUtils.sha256Hex(new FileInputStream(file));
break;
case SHA_512:
checksum = DigestUtils.sha512Hex(new FileInputStream(file));
break;
default:
checksum = DigestUtils.md5Hex(new FileInputStream(file));
}
return checksum;
}
三、使用com.google.common.io.Files.hash
使用Guava来完成,Maven工程需要添加依赖包,如:
com.google.guava
guava
23.0
简单代码如下,通过调用com.google.common.io.Files的hash方法即可:public static String genChecksum3(File file, CheckSumAlgoType checkSumAlgoType) throws IOException {
/** * 使用Guava */
String checksum = null;
switch (checkSumAlgoType) {
case MD5:
checksum = com.google.common.io.Files.hash(file, Hashing.md5()).toString();
break;
case SHA_1:
checksum = com.google.common.io.Files.hash(file, Hashing.sha1()).toString();
break;
case SHA_256:
checksum = com.google.common.io.Files.hash(file, Hashing.sha256()).toString();
break;
case SHA_512:
checksum = com.google.common.io.Files.hash(file, Hashing.sha512()).toString();
break;
default:
checksum = com.google.common.io.Files.hash(file, Hashing.md5()).toString();
}
return checksum;
}
验证
最后,我们一起来验证一下上述几种方法对文件的checksum计算。public static void main(String[] args) throws NoSuchAlgorithmException, IOException {
File file = new File("/users/wmj/Downloads/poi-bin-4.1.0-20190412.tar.gz");
for (CheckSumAlgoType type : CheckSumAlgoType.values()) {
System.out.println("采用" + type.getName() + "计算checksum");
System.out.println( String.format("method=%s,checksum=%s", "genChecksum1", genChecksum1(file, type.getName())));
System.out.println(String.format("method=%s,checksum=%s", "genChecksum2", genChecksum2(file, type)));
System.out.println(String.format("method=%s,checksum=%s", "genChecksum3", genChecksum3(file, type)));
System.out.println();
}
}
运行结果如下:
采用MD5计算checksummethod=genChecksum1,checksum=2fa39c79790c29c53368ec0c14fdea97method=genChecksum2,checksum=2fa39c79790c29c53368ec0c14fdea97method=genChecksum3,checksum=2fa39c79790c29c53368ec0c14fdea97采用SHA-256计算checksummethod=genChecksum1,checksum=d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bbmethod=genChecksum2,checksum=d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bbmethod=genChecksum3,checksum=d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bb采用SHA-512计算checksummethod=genChecksum1,checksum=87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9method=genChecksum2,checksum=87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9method=genChecksum3,checksum=87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9采用SHA1计算checksummethod=genChecksum1,checksum=f56e42474fa81676d82a38ae6a8df67194a50b93method=genChecksum2,checksum=f56e42474fa81676d82a38ae6a8df67194a50b93method=genChecksum3,checksum=f56e42474fa81676d82a38ae6a8df67194a50b93
我们可以看到,计算结果和Apache上显示的checksum是一致的。
本文主要给出了三种计算checksum的方式,包括:
使用java.security.MessageDigest
使用org.apache.commons.codec.digest.DigestUtils
使用com.google.common.io.Files.hash
当然,可能还有其它的实现方式和工具包,如果读者发现其它的也可以同步一下,一起学习。
java 文件checksum_计算文件Checksum的几种方法相关推荐
- 用python修改文件内容修改txt内容的3种方法
用python修改文件内容修改txt内容的3种方法 方法一.修改原文件方式 def updateFile(file,old_str,new_str):"""替换文件中的字 ...
- 多个PDF文件如何合并成一个?两种方法轻松get
在日常学习生活中,如果你需要将多个文档整合为一个完整的文件,比如说多篇文章.多张图片.多个表格等等,这时候就需要将这些文档合并成一个PDF文件.如何将多个PDF文件如何合并成一个?两种方法轻松帮你搞定 ...
- attrib批量显示文件夹_电脑中病毒,文件夹全部变成快捷方式?3种方法轻松解决!...
原标题:电脑中病毒,文件夹全部变成快捷方式?3种方法轻松解决! 最近有位朋友去打印店的时候,u盘一不小心就带回了1KB快捷方式病毒,导致电脑u盘里的文件以及文件夹全部变成了快捷方式,不知道如何解决. ...
- 剪切的文件丢失如何找回?这四种方法可试
剪切文件相当于在设备中进行文件删除,而一旦剪切过程中出现错误就容易造成源文件丢失.那么剪切文件丢失如何恢复?下面将分享剪切丢失文件恢复的方法,均以win10系统为例进行操作. ▌第一种方法:撤销移动 ...
- amr文件怎么转换成mp3,5种方法供你选择
amr文件怎么转换成mp3?如果你常常使用手机录音或下载手机铃声,那么AMR格式对你来说一定不会陌生.因为amr文件的资源占用率低.传输方便,通常用作各大手机厂商广泛使用的一种保存录音文件的格式,非常 ...
- java 上传图片,图片预览,2种方法
java 上传图片,图片预览,2种方法 1. 方法一:将图片上传到特定磁盘 html页面,form表单内容: <div class="layui-form-item"> ...
- Java构造和解析Json数据的两种方法详解一
在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...
- Java 判断字符串是否为空的四种方法、优缺点与注意事项
以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...
- [转]DES加密 java与.net可以相互加密解密两种方法
[转]原文地址:http://jumpman.javaeye.com/blog/605996 DES加密 java与.net可以相互加密解密两种方法 文章分类:Java编程 通过这个方法可以实现jav ...
最新文章
- UBUNTU 下查看所有的C库函数和查询 LINUX 编成必备
- Linux安装zookeeper并验证
- 从JavaFX 1.3迁移到JavaFX 2.0
- c语言设计二级考试程序修改题,全国计算机二级考试C语言复习题与答案解析
- 【ExtJS】关于alias和xtype
- windows环境下部署Tomcat到服务器
- Webpack 配置摘要
- MySQL 操作 —— group by(按组)
- 15道AI 机器学习笔试题(暂时没有答案)
- 关于c++库文件的一点使用体会
- Android开发技巧:给Button的点击上色
- linux mount挂载
- 思科下一代模拟器EVE-NG做一个ASA防火墙简单小实验
- 山东大学高频电子线路实验一 高频小信号放大实验详解
- CDD文件——CANdelaStudio
- Android安装步骤
- 机器学习进阶 day4
- 杉德支付php代码实现_[转]PHP语言开发Paypal支付demo的具体实现
- Reflexive公司小游戏下载地址
- 申论省考必须背的一篇倡议书
热门文章
- 九天创新智能科技有限公司诚招--SLAM/规划/控制/感知/定位/导航算法工程师
- 人力资源系统需求规格说明书
- robot光线机器人安卓版_灯光机器人游戏下载-灯光机器人安卓版下载_飞翔下载...
- FireEye 红队失窃工具大揭秘之:分析复现SolarWinds RCE 0day (CVE-2020-10148)
- echarts 地图统计
- python打包代码中涉及的图片_pyinstaller打包程序 带图片
- 【电源设计】08电源中电容大小的计算
- 基于pytesseract和MTCNN的身份证识别
- linux 系统 JAVA_HOME is not set问题解决
- HTML 中 id、name、class 区别