了解签名和验证

Java™平台使您可以对 JAR 文件进行数字签名。您对文件进行数字签名的原因与您可能会用钢笔和墨水签署纸质文档的原因相同,以使 Reader 知道您已经写过该文档,或者至少该文档获得了您的认可。

例如,当您在一封信上签名时,每个识别您的签名的人都可以确认您写了这封信。同样,当您对文件进行数字签名时,任何“识别”您的数字签名的人都知道该文件来自您。 “识别”电子签名的过程称为* verification *。

对 JAR 文件进行签名后,您还可以选择对签名进行时间戳记。与在纸质文档上放置日期相似,对签名进行时间戳记可以标识 JAR 文件何时签名。时间戳可以用来验证用于签名 JAR 文件的证书在签名时是否有效。

签名和验证文件的能力是 Java 平台安全体系结构的重要组成部分。安全性由运行时有效的安全性* policy *控制。您可以配置策略以向 Servlets 和应用程序授予安全特权。例如,您可以授予 applet 权限以执行通常被禁止的操作,例如读写本地文件或运行本地可执行程序。如果您下载了某些由受信任实体签名的代码,则可以将该事实用作确定分配给该代码的安全权限的标准。

一旦您(或您的浏览器)验证了 applet 来自受信任的来源,您就可以让平台放宽安全限制,以使 applet 执行通常被禁止的操作。受信任的 applet 可以具有有效的“策略文件”指定的自由。

Java 平台通过使用称为 public 和 private * keys *的特殊数字来进行签名和验证。公钥和私钥成对出现,并起到互补的作用。

私钥是可以用来签署文件的电子“笔”。顾名思义,您的私钥只有您自己知道,因此没有其他人可以“伪造”您的签名。用您的私钥签名的文件只能通过相应的公钥进行验证。

但是,仅公钥和私钥还不足以 true 验证签名。即使您已验证签名文件中包含匹配的密钥对,您仍然需要某种方法来确认公钥实际上来自其声称来自的签名者。

因此,还需要一个元素来进行签名和验证。该附加元素是签名者包括在已签名的 JAR 文件中的* certificate *。证书是来自公认的“证书颁发机构”的数字签名声明,表明谁拥有特定的公共密钥。证书颁发机构是在整个行业中受信任的实体(通常是专门从事数字安全性的公司),为密钥及其所有者签名和颁发证书。对于签名的 JAR 文件,证书会指出谁拥有 JAR 文件中包含的公共密钥。

当您对 JAR 文件签名时,您的公钥和关联的证书将放置在归档文件中,以便任何想要验证您的签名的人都可以轻松使用。

总结数字签名:

  • 签名者使用私钥对 JAR 文件进行签名。

  • 相应的公用密钥及其证书将放置在 JAR 文件中,以便希望验证签名的任何人都可以使用。

摘要和签名文件

签名 JAR 文件时,归档文件中的每个文件都会在归档文件的manifest中获得摘要条目。这是这样的条目可能看起来的示例:

Name: test/classes/ClassOne.class
SHA1-Digest: TD1GZt8G11dXY2p4olSZPc5Rj64=

摘要值是签名时文件内容的哈希值或编码表示形式。当且仅当文件本身发生更改时,文件摘要才会更改。

对 JAR 文件进行签名后,会自动生成一个* signature *文件,并将其放置在 JAR 文件的META\-INF目录中,该目录与包含存档清单的目录相同。签名文件的文件名带有\.SFextensions。这是签名文件内容的示例:

Signature-Version: 1.0
SHA1-Digest-Manifest: h1yS+K9T7DyHtZrtI+LxvgqaMYM=
Created-By: 1.7.0_06 (Oracle Corporation)

Name: test/classes/ClassOne.class
SHA1-Digest: fcav7ShIG6i86xPepmitOVo4vWY=

Name: test/classes/ClassTwo.class
SHA1-Digest: xrQem9snnPhLySDiZyclMlsFdtM=

Name: test/images/ImageOne.gif
SHA1-Digest: kdHbE7kL9ZHLgK7akHttYV4XIa0=

Name: test/images/ImageTwo.gif
SHA1-Digest: mF0D5zpk68R4oaxEqoS9Q7nhm60=

如您所见,签名文件包含归档文件的摘要条目,这些条目看起来类似于清单中的摘要值条目。但是,清单中的摘要值是根据文件本身计算的,而签名文件中的摘要值是根据清单中的相应条目计算的。签名文件还包含整个清单的摘要值(请参见上例中的SHA1\-Digest\-ManifestHeaders)。

验证签名的 JAR 文件时,将重新计算其每个文件的摘要,并将其与清单中记录的摘要进行比较,以确保自签名以来 JAR 文件的内容没有更改。作为附加检查,清单文件本身的摘要值将重新计算,并与签名文件中记录的值进行比较。

您可以在 JDK™文档的Manifest Format页上阅读有关签名文件的其他信息。

签名阻止文件

除了签名文件,签名 JAR 文件时,签名块文件会自动放置在META\-INF目录中。与清单文件或签名文件不同,签名阻止文件不是人类可读的。

签名块文件包含两个对验证必不可少的元素:

  • 使用签名者的私钥生成的 JAR 文件的数字签名

  • 包含签名者公钥的证书,任何想要验证签名的 JAR 文件的人都可以使用

签名块文件名通常具有\.DSAextensions,表明它们是由默认的数字签名算法创建的。如果使用与某些其他标准算法关联的密钥进行签名,则可以使用其他文件名 extensions。


有关密钥,证书和证书颁发机构的其他信息,请参阅

有关 Java 平台的安全体系结构的更多信息,请参阅以下相关文档: