回忆一下,自己是否在网站上下载文件时看到过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的几种方法相关推荐

  1. 用python修改文件内容修改txt内容的3种方法

    用python修改文件内容修改txt内容的3种方法 方法一.修改原文件方式 def updateFile(file,old_str,new_str):"""替换文件中的字 ...

  2. 多个PDF文件如何合并成一个?两种方法轻松get

    在日常学习生活中,如果你需要将多个文档整合为一个完整的文件,比如说多篇文章.多张图片.多个表格等等,这时候就需要将这些文档合并成一个PDF文件.如何将多个PDF文件如何合并成一个?两种方法轻松帮你搞定 ...

  3. attrib批量显示文件夹_电脑中病毒,文件夹全部变成快捷方式?3种方法轻松解决!...

    原标题:电脑中病毒,文件夹全部变成快捷方式?3种方法轻松解决! 最近有位朋友去打印店的时候,u盘一不小心就带回了1KB快捷方式病毒,导致电脑u盘里的文件以及文件夹全部变成了快捷方式,不知道如何解决. ...

  4. 剪切的文件丢失如何找回?这四种方法可试

    剪切文件相当于在设备中进行文件删除,而一旦剪切过程中出现错误就容易造成源文件丢失.那么剪切文件丢失如何恢复?下面将分享剪切丢失文件恢复的方法,均以win10系统为例进行操作. ▌第一种方法:撤销移动 ...

  5. amr文件怎么转换成mp3,5种方法供你选择

    amr文件怎么转换成mp3?如果你常常使用手机录音或下载手机铃声,那么AMR格式对你来说一定不会陌生.因为amr文件的资源占用率低.传输方便,通常用作各大手机厂商广泛使用的一种保存录音文件的格式,非常 ...

  6. java 上传图片,图片预览,2种方法

    java 上传图片,图片预览,2种方法 1. 方法一:将图片上传到特定磁盘 html页面,form表单内容: <div class="layui-form-item"> ...

  7. Java构造和解析Json数据的两种方法详解一

    在www.json.org上公布了很多JAVA下的json构造和解析工具,其中org.json和json-lib比较简单,两者使用上差不多但还是有些区别.下面首先介绍用json-lib构造和解析Jso ...

  8. Java 判断字符串是否为空的四种方法、优缺点与注意事项

    以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...

  9. [转]DES加密 java与.net可以相互加密解密两种方法

    [转]原文地址:http://jumpman.javaeye.com/blog/605996 DES加密 java与.net可以相互加密解密两种方法 文章分类:Java编程 通过这个方法可以实现jav ...

最新文章

  1. UBUNTU 下查看所有的C库函数和查询 LINUX 编成必备
  2. Linux安装zookeeper并验证
  3. 从JavaFX 1.3迁移到JavaFX 2.0
  4. c语言设计二级考试程序修改题,全国计算机二级考试C语言复习题与答案解析
  5. 【ExtJS】关于alias和xtype
  6. windows环境下部署Tomcat到服务器
  7. Webpack 配置摘要
  8. MySQL 操作 —— group by(按组)
  9. 15道AI 机器学习笔试题(暂时没有答案)
  10. 关于c++库文件的一点使用体会
  11. Android开发技巧:给Button的点击上色
  12. linux mount挂载
  13. 思科下一代模拟器EVE-NG做一个ASA防火墙简单小实验
  14. 山东大学高频电子线路实验一 高频小信号放大实验详解
  15. CDD文件——CANdelaStudio
  16. Android安装步骤
  17. 机器学习进阶 day4
  18. 杉德支付php代码实现_[转]PHP语言开发Paypal支付demo的具体实现
  19. Reflexive公司小游戏下载地址
  20. 申论省考必须背的一篇倡议书

热门文章

  1. 九天创新智能科技有限公司诚招--SLAM/规划/控制/感知/定位/导航算法工程师
  2. 人力资源系统需求规格说明书
  3. robot光线机器人安卓版_灯光机器人游戏下载-灯光机器人安卓版下载_飞翔下载...
  4. FireEye 红队失窃工具大揭秘之:分析复现SolarWinds RCE 0day (CVE-2020-10148)
  5. echarts 地图统计
  6. python打包代码中涉及的图片_pyinstaller打包程序 带图片
  7. 【电源设计】08电源中电容大小的计算
  8. 基于pytesseract和MTCNN的身份证识别
  9. linux 系统 JAVA_HOME is not set问题解决
  10. HTML 中 id、name、class 区别