4

目前我们使用 jarsigner 对我们的 jar 进行签名。然后,我们显示一些特定类的一些 SHA1-Digest 值,以向外部审计员证明代码在版本之间没有更改。

我们只依靠META-INF/xxx.SF文件来获取摘要信息,我们从不使用META-INF/xxx.DSA签名块文件。

由于我们只需要代码中的摘要计算,我想知道是否可以.SF使用一些 java 工具生成文件而不实际使用密钥。

我阅读了http://docs.oracle.com/javase/6/docs/technotes/tools/windows/jarsigner.html但看起来密钥是强制性的。

4

2 回答 2

7

这应该是可能的。MANIFEST.MF 文件包含相应类文件的 Base64 编码的 SHA-1。

从您的文档中:

In the manifest file, the SHA digest value for each source file is the
digest (hash) of the binary data in the source file. In the .SF file,
on the other hand, the digest value for a given source file is the
hash of the three lines in the manifest file for the source file.

因此,遍历所有类文件,计算 SHA-1,按照它在 MANIFEST.MF 中出现的格式,然后散列它并按照它在 SF 文件中出现的格式。

计算不涉及密钥。

示例:考虑“jce1_2_2.jar”(或您已正确签名的任何内容)。这包含

  1. MANIFEST.MF 形式的条目

    Name: javax/crypto/KeyAgreement.class
    SHA1-Digest: c2p0JimzpV0dG+NChGLl5cI7MuY=
    <empty line>
    
  2. 这是“KeyAgreement.class”的Base64(SHA1-1)(路径不相关)。注意第三个空行。行结尾是 CRLF (Windows)。

  3. META-INF/4JCEJARS.SF 条目

    Name: javax/crypto/KeyAgreement.class
    SHA1-Digest: whGBXE+AvYO6wAoVCdnocOPIrsE=
    

这不是文件的哈希值,而是上面那三行的哈希值。

于 2012-02-14T13:52:06.017 回答
1

签名验证将失败...

为什么?

JAR 文件验证 -> 验证 .SF 文件本身的签名。

也就是说,验证确保存储在每个签名块 (.DSA) 文件中的签名实际上是使用与证书(或证书链)也出现在 .DSA 文件中的公钥对应的私钥生成的。它还确保签名是相应签名(.SF)文件的有效签名,因此.SF文件没有被篡改。

更多信息 http://docs.oracle.com/javase/7/docs/technotes/tools/windows/jarsigner.html

于 2014-05-14T18:47:16.250 回答