如标题所示,有这样一个函数,该函数将ByteArrayResource和表示要使用的算法名称的String作为参数。
我正在使用java.security.MessageDigest
以及GnuCrypto
和BouncyCastleProvider
提供程序。
我有一些问题,确定问题可能是什么,我的机器和Jenkins之一都运行java 11,这里的代码:
试验:
void hashOk{
byte[] bytes = Files.readAllBytes(Path.of("path/to/file.xml"));
String hash1 = "5EDF3285285FDABCFFB7019E2442B31F";
String hash2 = hashService.hash(new ByteArrayResource(bytes), "MD5");
Assertions.assertEquals(hash1, hash2);
}
服务:
public String hash(ByteArrayResource obj, String algorithm) throws NoSuchAlgorithmException {
Security.addProvider(new BouncyCastleProvider());
Security.addProvider(new GnuCrypto());
var md = MessageDigest.getInstance(algorithm);
try (DigestInputStream dis = new DigestInputStream(new BufferedInputStream(obj.getInputStream()), md)) {
byte[] buffer = new byte[1024];
while (dis.read(buffer) != -1) ;
byte[] hash = md.digest();
return DatatypeConverter.printHexBinary(hash).toUpperCase();
} catch (IOException e) {...} }
我错过什么了吗?
以下是测试的结果,其中“hash1”是控制字符串,“hash2”是生成的字符串:
本地MD5
hash1: 5EDF3285285FDABCFFB7019E2442B31F
hash2: 5EDF3285285FDABCFFB7019E2442B31F
JenkinsMD5
hash1: 5EDF3285285FDABCFFB7019E2442B31F
hash2: 7A7E0BBA2452963746BA4D71EB8CCFA3
我也尝试了不同的机器与Jenkins和它给出了相同的结果。
我找到的一些解决方案只是相同代码的不同排列(我也尝试过)。
有一个命令告诉我更改pom.xml
,并将maven-surefire-plugin
上的forkCount
属性设置为0,但这给了我一个异常,因为它找不到散列测试(?)的文件。
1条答案
按热度按时间vwoqyblh1#
我解决了这个问题,这真的是一个问题与文件的阅读。
在我将文件内容放在一行中并更改代码以只读取该文件一次(而不是每次测试读取一次)之后,一切都正常了。
谢谢你的帮助!