Java中DigestUtils生成的SHA-256哈希与文件哈希不一致如何解决?
SHA-256哈希对比不一致的解决方案
你遇到的核心问题是数据格式不匹配:test.sha256存储的是SHA-256哈希的十六进制字符串,而DigestUtils.sha256()生成的是哈希的原始二进制字节数组。直接对比Files.readAllBytes(test.sha256)(字符串的字节)和哈希二进制字节数组,自然会返回false,和有符号/无符号字节无关。
正确实现步骤
- 读取test.sha256文件内容,提取纯十六进制哈希字符串(剔除换行、空格等无关字符)
- 将十六进制字符串转换为二进制字节数组
- 对data.txt生成对应算法的哈希二进制字节数组
- 对比两个字节数组是否相等
代码示例
需要额外导入Apache Commons Codec的Hex类,完整实现如下:
import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.codec.binary.Hex; import java.nio.file.Files; import java.nio.file.Paths; import java.util.Arrays; public class HashValidator { public static boolean validateHash(String dataFilePath, String hashFilePath, String algorithm) throws Exception { // 读取并处理存储的哈希字符串,去除空白字符 String storedHexHash = new String(Files.readAllBytes(Paths.get(hashFilePath))) .trim() .replaceAll("\\s+", ""); // 将十六进制字符串转为二进制字节数组 byte[] storedHashBytes = Hex.decodeHex(storedHexHash); // 生成数据文件的哈希二进制字节数组(算法可配置) byte[] generatedHashBytes = DigestUtils.getDigest(algorithm).digest(Files.readAllBytes(Paths.get(dataFilePath))); // 对比两个字节数组 return Arrays.equals(storedHashBytes, generatedHashBytes); } public static void main(String[] args) throws Exception { boolean isValid = validateHash("data.txt", "test.sha256", "SHA-256"); System.out.println("哈希验证结果:" + isValid); // 应返回true } }
补充说明
Hex.decodeHex()是处理十六进制字符串转二进制的可靠方式,避免手动转换出错- 空白字符处理逻辑兼容哈希文件中可能存在的换行、空格;如果哈希文件后附带文件名注释,可额外截取前64个字符(SHA-256十六进制固定为64位)
- 算法通过参数传入,满足你"不硬编码"的要求
内容的提问来源于stack exchange,提问作者ojacomarket
相关产品推荐
相关产品推荐

