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

  1. 使用java.security.MessageDigest
  2. 使用org.apache.commons.codec.digest.DigestUtils
  3. 使用com.google.common.io.Files.hash

一、使用java.security.MessageDigest

  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();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工程需要添加依赖包,如:

<!-- https://mvnrepository.com/artifact/commons-codec/commons-codec -->
<dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.13</version>
</dependency>

简单代码如下,通过调用类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工程需要添加依赖包,如:

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>23.0</version>
</dependency>

简单代码如下,通过调用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计算checksum
method=genChecksum1,checksum=2fa39c79790c29c53368ec0c14fdea97
method=genChecksum2,checksum=2fa39c79790c29c53368ec0c14fdea97
method=genChecksum3,checksum=2fa39c79790c29c53368ec0c14fdea97采用SHA-256计算checksum
method=genChecksum1,checksum=d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bb
method=genChecksum2,checksum=d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bb
method=genChecksum3,checksum=d8db4f8228d87935ca46b0af72db68ad83f45b31d885e67b089d195b5ee800bb采用SHA-512计算checksum
method=genChecksum1,checksum=87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9
method=genChecksum2,checksum=87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9
method=genChecksum3,checksum=87499ab94882605ee2f407fc66e24c613ae98896b8d5f527b6cd8c604574922fc72d148da42962b2ee30ad18cd712e3de42bfe14770261b07217717c52a738a9采用SHA1计算checksum
method=genChecksum1,checksum=f56e42474fa81676d82a38ae6a8df67194a50b93
method=genChecksum2,checksum=f56e42474fa81676d82a38ae6a8df67194a50b93
method=genChecksum3,checksum=f56e42474fa81676d82a38ae6a8df67194a50b93

我们可以看到,计算结果和Apache上显示的checksum是一致的。

本文主要给出了三种计算checksum的方式,包括:

  1. 使用java.security.MessageDigest
  2. 使用org.apache.commons.codec.digest.DigestUtils
  3. 使用com.google.common.io.Files.hash

java 生成 checksum相关推荐

  1. java生成缩略图类源码

    把做工程过程比较好的一些内容备份一下,如下内容段是关于 java生成缩略图类的内容. package com.whatycms.common.util; import java.awt.image.B ...

  2. java 生成二维码 QRCode、zxing 两种方式

    版权声明:本文为 testcs_dn(微wx笑) 原创文章,非商用自由转载-保持署名-注明出处,谢谢. https://blog.csdn.net/testcs_dn/article/details/ ...

  3. 超详细的java生成excel文件并下载

    在网上随手一搜,可以搜到很多java生成excel文件相关的博客,但每个都有不同,核心点说清楚了,但具体运用的时候,相信大家或多或少都没法一次直接运用,这样每次去找并且运用的时候很费时间,所以这也是我 ...

  4. java生成HMACSHA256的方法

    java生成HMACSHA256的方法 答: data要加密的数据,key密钥 public static String HMACSHA256(String data, String key) thr ...

  5. java生成验证码实例_Java生成验证码功能实例代码

    页面上输入验证码是比较常见的一个功能,实现起来也很简单.给大家写一个简单的生成验证码的示例程序,需要的朋友可以借鉴一下. 闲话少续,直接上代码.代码中的注释很详细. package com.SM_te ...

  6. Java生成CRC16数据校验码

    CRC即循环冗余校验码(Cyclic Redundancy Check[1]  ):是数据通信领域中最常用的一种查错校验码,其特征是信息字段和校验字段的长度可以任意选定.循环冗余检查(CRC)是一种数 ...

  7. java代码上传到私服,java生成 java代码 上传maven私服

    功能:利用java 生成java类 ,并上传至maven私服 使用开源框架:https://github.com/square/javapoet JavaWriter分支 环境:jdk1.8 mave ...

  8. java生成验证码工具类_Java生成图形验证码工具类

    生成验证码效果 validatecode.java 验证码生成类 package cn.dsna.util.images; import java.awt.color; import java.awt ...

  9. java 其他文件转pdf_java 其他文件转成pdf java生成pdf

    java生成pdf需要用到的包pd4ml.jar 下载地址:http://download.csdn.net/detail/yanning1314/7124741 package com.cular. ...

最新文章

  1. ajaxFileUpload plugin上传文件 chrome、Firefox中出现SyntaxError:unexpected token
  2. python求单链表的长度_709. 设计链表(Python)
  3. Android TextView 带背景的文字垂直方向显示(ems属性)
  4. html5连接mysql数据库操作_html5-本地数据库的操作
  5. php轮询 ob_start,详解PHP ob_start()函数的功能要点
  6. Android----View
  7. 台式计算机usb口不能用,电脑usb接口没反应是什么原因?电脑usb接口没反应解决方法...
  8. 向量场的散度和旋度_矢量场问题一个矢量场的散度和旋度都为零,能 – 手机爱问...
  9. 财务报告及会计基础知识
  10. Notepad++分隔符显示SOH,STX,ETX
  11. PHP:【商城后台管理系统】部署角色管理,角色添加,菜单权限,删除角色功能
  12. 【TCP 协议2】确认应答、超时重传机制
  13. 汇编语言DEBUG命令详解||汇编命令||DEBUG的常用命令:A,U,R,T,D,E,Q 等等
  14. 海思nb-iot芯片 hi2115外围硬件调试记录
  15. opencv图像特征之尺寸不变特性+算法对比总结
  16. Docker GUI调研
  17. vue3+vite 项目动态渲染本地图片
  18. STM32CubeMX 配置CAN总线进行双板通信(STM32F103C8T6)
  19. 尚观python培训_尚观Python基础入门视频教程
  20. 出现java exception has occured错误的解决方法

热门文章

  1. windows下的网络配置
  2. 一文弄懂数据结构中的红黑树、二叉树
  3. 整数a和整数b间1的个数
  4. .hpp文件和.h文件的区别
  5. 单片机:看门狗程序简介
  6. 什么是Apptainer?如何在Ubuntu服务器上安装?
  7. ASEMI代理MC34PF3001A7EP原装现货NXP车规级MC34PF3001A7EP
  8. 名企笔试:网易游戏2017招聘笔试题(赶去公司)
  9. PCB设计——使用Altium Designer做PCB拼版文件技巧总结
  10. 数据结构单链表——一元多项式求和(C语言版)