文件名称+大小判断可以实现,但是会小概率出现文件重复的情况。这种判断放在生产环境中也可以稳定的跑上一阵子,不过即使再低的可能性也是有可能的,所以需要使用更稳定安全的方法
主要介绍的是以下三种
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值,防止有人恶意篡改小工具,保证小工具可以放心使用。
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);
}
}
在相同算法下,任何新建空文件的摘要值都是固定的。
任何两个内容相同的文件的摘要值都是相同的,和路径、文件名、文件类型无关。
文件的摘要值会随着文件内容的改变而改变。
2 comments
大佬真能输出
如有帮助欢迎常来