我从https://docs.oracle.com/javase/tutorial/deployment/jar/intro.html了解到,使用jarsigner签署jar文件的过程如下:
使用每个文件的哈希列表更新清单文件:
名称: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 =
创建签名文件(* .SF)。它包含:
创建签名块文件(* .RSA,* .DSA)。它存储* .SF签名文件的数字签名。
所以,我想知道为什么我们需要* .SF-为什么我们不能只签署一个清单文件,而不是* .SF文件?
此外,在* .SF文件中散列哈希值的目的是什么(附加检查?在什么情况下?)?
答案 0 :(得分:3)
签名文件(.SF
)代表.jar
文件的签名者 - 技术上可能不止一个。
回答第二个问题,想象一下.jar
文件在签名后被修改的情况。 manifest
文件已更改,因此.SF
(*-Digest-Manifest
)中的哈希值将不再与当前.manifest
文件的哈希值匹配。
但是,如果只有新文件被添加到.jar
,它仍然会通过验证,因为验证算法(以及其他内容)会查看.SF
中的每个条目并验证针对manifest
中的相应条目({1}}中的新条目将被忽略)。
总结一下,manifest
用于验证签名时.SF
内的所有文件都没有更改。
您可以阅读有关签名验证的更多信息here。