如何在JAR的.SF签名文件中计算SHA256哈希值?

问题描述 投票:0回答:1

我目前正在尝试将JAR签名者写成一个副项目。在清单文件(.MF)中,我添加了每个文件的Base64编码的SHA256哈希,如下所示:

Name: com/sample/MySample.class
SHA-256-Digest: TRqPMBJdQrIg5jHsAaoT1Rp5fjFjB8z/c2I+AHs5rX8=

在签名文件(.SF)中,我必须为每个文件添加另一个SHA256-hash,但我不确定它是如何计算的。 docs说,它是相应清单块的SHA256哈希,但是将字符串从“名称”散列到摘要的末尾并不会给我与JDK的原始jarsigner.exe相同的结果。

如何计算这个哈希?

我试图散列各种不同的东西(例如,重新散列哈希,散列整个块,仅散列名称和散列)但没有任何效果。是否有任何文档更好地描述了哈希的内容?

java jar jar-signing
1个回答
0
投票

首先,加载要在消息摘要中编码的字节。这是如何为文件完成的(添加必要的try-catch-finally块)。

MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");

DigestInputStream digestIs = new DigestInputStream(new FileInputStream(fileToValidate), messageDigest);
OutputStream nullOutputStream = new NullOutputStream();

// Read all bytes for the DigestInputStream to see them
IOUtils.copy(digestIs, nullOutputStream);
digestIs.close()

然后,如您链接到的文档中所指定的,需要在base64中表示散列。此代码将消化的byte[]转换为base64编码的字符串:

String fileDigest = new String(Base64.encode(messageDigest.digest(), Base64.NO_WRAP));

NO_WRAP标志只删除字符串末尾的额外\n

© www.soinside.com 2019 - 2024. All rights reserved.