文件名称+大小判断可以实现,但是会小概率出现文件重复的情况。这种判断放在生产环境中也可以稳定的跑上一阵子,不过即使再低的可能性也是有可能的,所以需要使用更稳定安全的方法
主要介绍的是以下三种

MD5算法运行1000次的平均时间为:226ms
SHA1算法运行1000次的平均时间为:308ms
SHA256算法运行1000次的平均时间为:473ms

安全性方面,显然SHA256(又称SHA2)的安全性最高,但是耗时要比其他两种多很多。MD5相对较容易碰撞,因此,SHA1应该是这三种中性能最好的一款加密算法,早在 2019 年,微软就已将 Windows 更新签名改成仅使用更安全的 SHA-2 算法,并于 2020 年 8 月 3日淘汰了官方下载中心的所有 SHA-1 签名内容
SHA-1 散列算法已被证实存在缺陷,此外随着处理器性能的提升、以及云计算的出现,其安全性已随时间推移而逐渐降低,所以更推荐使用SHA-2更为安全可靠的算法

文件摘要校验

下载一些些小工具会附带一个校验器让你校验附带提供的checksum值,防止有人恶意篡改小工具,保证小工具可以放心使用。
微信图片_20220508225742.png

ShaUtil加密工具类

package com.songzixian.blog.util;

import org.apache.commons.codec.digest.DigestUtils;
import org.apache.tomcat.util.buf.HexUtils;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * <p>
 * Description: SHA加密检验工具类
 * </p>
 *
 * @author songzixian
 * @version v2.0.0
 * @create 2022-05-08 21:04
 * @see com.songzixian.blog.util
 */
public class ShaUtil {

    //SHA-1 SHA-224 SHA-256 SHA-384 SHA-512
    private final static String SHA_1 = "SHA-1";
    private final static String SHA_2 = "SHA-256";

    /**
     * description SHA加密方法
     *
     * @param:  [path, algorithm]
     * @return {@link String}
     * @Date   2022/5/8
    */
    public static String extractChecksum(String filePath, String algorithm) throws NoSuchAlgorithmException, IOException {
        // 根据算法名称初始化摘要算法
        MessageDigest digest = MessageDigest.getInstance(algorithm);
        // 读取文件的所有比特
        byte[] fileBytes = Files.readAllBytes(Paths.get(filePath));
        // 摘要更新
        digest.update(fileBytes);
        //完成哈希摘要计算并返回特征值
        byte[] digested = digest.digest();
        // 进行十六进制的输出
        return HexUtils.toHexString(digested);
    }


    /**
     * description 文件加密对比原有SHA值
     *
     * @param:  [filePath: 文件路径, hashValue: 原有哈希值]
     * @return {@link boolean}
     * @Date   2022/5/8
    */
    public boolean fileComparisonHash(String filePath ,String hashValue) throws NoSuchAlgorithmException, IOException {
        String checksum = extractChecksum(filePath, "SHA-1");
        if (hashValue.equals(checksum)){
            return true;
        }
        return false;
    }


    /**
     * description 测试
     *
     * @param:  [args]
     * @return
     * @Date   2022/5/8
    */
    public static void main(String[] args) throws NoSuchAlgorithmException, IOException {

        //SHA-1 加密
        String path1 = "D:\\1.png";
        String checksum1 = extractChecksum(path1, SHA_1);
        System.out.println("SHA-1:" + checksum1);

        //SHA-256 加密
        String path2 = "D:\\1.png";
        String checksum2 = extractChecksum(path2, SHA_2);
        System.out.println("SHA-2:" + checksum2);
    }


}

在相同算法下,任何新建空文件的摘要值都是固定的。
任何两个内容相同的文件的摘要值都是相同的,和路径、文件名、文件类型无关。
文件的摘要值会随着文件内容的改变而改变。

Last modification:May 8, 2022
如果觉得这篇技术文章对你有用,请随意赞赏