签署jar文件时签名文件(* .SF)的用途是什么?

时间:2017-03-27 15:56:03

标签: java jar digital-signature sign jarsigner

我从https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html了解到,使用jarsigner签署jar文件的过程如下:

  1. 使用每个文件的哈希列表更新清单文件:

    名称:com / qarks / util / files / diff / ui / main / DiffMergeFrame.class SHA-256-Digest:GZgPXG9YnmVGXb + hFwnJF4im4hb / qixX2Gs + ZNpdGFU =

    名称:com / qarks / util / ui / swing / PrintManager.class SHA-256-Digest:cO6XolXrk5NlHBocDF0fzojlwSAKlDoGsY / jdJ0fzdY =

  2. 创建签名文件(* .SF)。它包含:

    • 清单文件的哈希
    • 清单文件中主要属性的哈希值
    • 清单文件中每个文件的哈希值哈希。
  3. 创建签名块文件(* .RSA,* .DSA)。它存储* .SF签名文件的数字签名。

  4. 所以,我想知道为什么我们需要* .SF-为什么我们不能只签署一个清单文件,而不是* .SF文件?

    此外,在* .SF文件中散列哈希值的目的是什么(附加检查?在什么情况下?)?

1 个答案:

答案 0 :(得分:3)

签名文件(.SF)代表.jar文件的签名者 - 技术上可能不止一个。

回答第二个问题,想象一下.jar文件在签名后被修改的情况。 manifest文件已更改,因此.SF*-Digest-Manifest)中的哈希值将不再与当前.manifest文件的哈希值匹配。

但是,如果只有新文件被添加到.jar,它仍然会通过验证,因为验证算法(以及其他内容)会查看.SF中的每个条目并验证针对manifest中的相应条目({1}}中的新条目将被忽略)。

总结一下,manifest用于验证签名时.SF内的所有文件都没有更改。

您可以阅读有关签名验证的更多信息here