JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Java 计算文件Checksum方式

wys521 2025-01-07 16:33:14 精选教程 34 ℃ 0 评论

一、checksum 介绍


本文将简单介绍一下checksum(含义,作用)以及如何使用java程序计算出不同算法的checksum值,包括MD5、SHA-1,SHA-256以及SHA-512。

【含义】checksum:总和检验码,校验和。在数据处理和数据通信领域中,用于校验目的的一组数据项的和。这些数据项可以是数字或在计算检验总和过程中看作数字的其它字符串。通常是以十六进制为数制表示的形式。

【作用】用于检查文件完整性,检测文件是否被恶意篡改,比如文件传输(如插件、固件升级包等)场景使用。

二、checksum 实现


1、方法一:java.security.MessageDigest

/**
 * @description 计算文件checksum
 * @param [file, checkSumAlgo]
 * @return java.lang.String
 */
public static String getFileChecksum1(File file,CheckSumAlgoType checkSumAlgoType) throws NoSuchAlgorithmException, IOException {
    MessageDigest messageDigest = MessageDigest.getInstance(String.valueOf(checkSumAlgoType));
    messageDigest.update(Files.readAllBytes(file.toPath()));

    byte[] digestBytes = messageDigest.digest();

    return DatatypeConverter.printHexBinary(digestBytes).toLowerCase();
}

备注:因为,DatatypeConverter.printHexBinary(digestBytes)返回的字符大写,所以添加了toLowerCase()方法保持其一致性。

2、方法二:org.apache.commons.codec.digest.DigestUtils

(1) Maven工程需要添加依赖包:

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

(2) 实现方法:

/**
 * @description 计算文件checksum 
 * @param [file, checkSumAlgoType]
 * @return java.lang.String
 */
public static String getFileChecksum(File file,CheckSumAlgoType checkSumAlgoType)      
        throws FileNotFoundException, IOException {

    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;
}

3、方法三:com.google.common.io.Files.hash

(1) Maven工程需要添加依赖包:

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

(2) 实现方法:

/**
 * @description 计算文件checksum
 * @param [file, checkSumAlgoType]
 * @return java.lang.String
 */
public static String getFileChecksum(File file,CheckSumAlgoType checkSumAlgoType) throws IOException {
    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;
}

4、辅助枚举类:CheckSumAlgoType

/**
 * @author Jack
 * @version 1.0
 * @date 2021/10/11 10:37
 * @description: 文件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;
    }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表