对jar文件进行签名时,签名文件(* .SF)的作用是什么?

kol*_*bok 5 java jar sign digital-signature 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-摘要:GZgPXG9YnmVGXb + hFwnJF4im4hb / qixX2Gs + ZNpdGFU =

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

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

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

因此,我想知道为什么我们根本需要* .SF-为什么我们不能仅签名清单文件而不是* .SF文件?

还有* .SF文件中具有哈希值的目的是什么(附加检查?在什么情况下?)?

Jus*_*tas 5

签名文件 ( .SF) 代表文件的签名者.jar- 从技术上讲可以有多个签名者。

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

但是,如果仅将新文件添加到 中.jar,它仍然会通过验证,因为验证算法(除其他外)会查看 中的每个条目.SF并根据 中的相应条目验证哈希值(将忽略manifest中的新条目) manifest

总而言之,.SF用于验证签名时的所有文件.jar均未更改。

您可以在此处阅读有关签名验证的更多信息。