文档

Java™教程
隐藏目录
理解签名和验证
路径:部署
教程:将程序打包为JAR文件
部分:签名和验证JAR文件

理解签名和验证

Java™平台使您能够对JAR文件进行数字签名。就像您可能用钢笔和墨水签署纸质文件一样,您对文件进行数字签名是为了让读者知道您编写了该文件,或者至少该文件得到了您的批准。

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

当JAR文件被签名时,您还可以选择为签名加上时间戳。类似于在纸质文件上写上日期,时间戳标识了JAR文件签名的时间。时间戳可用于验证在签名时使用的证书是否有效。

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

一旦您(或您的浏览器)验证了小程序来自可信来源,您可以让平台放松安全限制,以允许小程序执行通常被禁止的操作。受信任的小程序可以根据生效的策略文件拥有特定的自由。

Java平台通过使用称为公钥和私钥的特殊数字来实现签名和验证。公钥和私钥成对出现,它们发挥着互补的作用。

私钥是您用来签署文件的电子“笔”。顾名思义,您的私钥仅为您所知,以便其他人无法“伪造”您的签名。使用您的私钥签署的文件只能通过相应的公钥进行验证。

然而,仅有公钥和私钥是不足以真正验证签名的。即使您已验证了签名文件包含匹配的密钥对,仍然需要一种方法来确认公钥实际上来自它所声称的签名者。

因此,为使签名和验证工作,还需要另一个元素。这个附加元素是签名者在签名的JAR文件中包含的证书。证书是一份由公认的认证机构数字签名的声明,指示谁拥有特定的公钥。认证机构是业界信任的实体(通常是专门从事数字安全的公司),它们签署并颁发用于密钥及其所有者的证书。在签名的JAR文件中,证书指示谁拥有该JAR文件中包含的公钥。

当您签名一个JAR文件时,您的公钥将与相关证书一起放置在存档中,以便任何想要验证您签名的人可以轻松使用。

总结数字签名:

摘要和签名文件

当您签名一个JAR文件时,存档中的每个文件都会在存档的清单中获得一个摘要条目。以下是这样一个条目的示例:

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

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

当一个JAR文件被签名时,会自动生成一个签名文件,并将其放置在JAR文件的META-INF目录中,该目录与存档的清单位于同一目录。签名文件的文件名具有.SF扩展名。以下是签名文件的内容示例:

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

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

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

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

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

如您所见,签名文件包含了存档文件的摘要条目,这些条目与清单中的摘要值条目相似。然而,清单中的摘要值是从文件本身计算得出的,而签名文件中的摘要值是从清单中相应条目计算得出的。签名文件还包含了整个清单的摘要值(请参见上述示例中的SHA1-Digest-Manifest头)。

在验证已签名的JAR文件时,会重新计算每个文件的摘要,并与清单中记录的摘要进行比较,以确保JAR文件的内容自签名以来未发生变化。作为附加检查,还会重新计算并比较清单文件本身的摘要值与签名文件中记录的值。

您可以在JDK™文档的清单格式页面上阅读有关签名文件的更多信息。

签名块文件

除了签名文件之外,当JAR文件被签名时,还会自动在META-INF目录中放置一个签名块文件。与清单文件或签名文件不同,签名块文件不可读。

签名块文件包含用于验证的两个关键元素:

签名块文件的文件名通常会有一个.DSA扩展名,表示它们是使用默认数字签名算法创建的。如果使用与其他标准算法相关的密钥进行签名,则可能会有其他文件名扩展名。


相关文档

有关密钥、证书和认证机构的更多信息,请参阅:

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


上一页: 签名和验证JAR文件
下一页: 签名JAR文件