文档

Java™ 教程-Java Tutorials 中文版
理解签名和验证
Trail: Deployment
Lesson: Packaging Programs in JAR Files
Section: Signing and Verifying JAR Files

理解签名和验证

Java™ 平台使你能够对 JAR 文件进行数字签名。你对文件进行数字签名的原因与你使用笔和墨水签署纸质文档的原因相同 - 让读者知道你编写了文档,或者至少证明文档已获得你的批准。

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

签名 JAR 文件时,你还可以选择为签名添加时间戳。与在纸质文档上添加日期类似,签名的时间戳标识了 JAR 文件的签名时间。时间戳可用于验证用于签署 JAR 文件的证书在签名时是否有效。

签名和验证文件的能力是 Java 平台安全架构的重要组成部分。安全性由运行时生效的安全性 policy (策略) 控制。你可以将策略配置为向 applet 和应用程序授予安全权限。例如,你可以向 applet 授予权限以执行正常禁止的操作,例如读取和写入本地文件或运行本地可执行程序。如果你下载了一些由受信任实体签名的代码,则可以将该事实用作决定分配给代码的安全权限的标准。

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

Java 平台通过使用称为公共和私有 keys (密钥) 的特殊号码来启用签名和验证。公钥和私钥成对出现,它们扮演互补角色。

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

但是,单独的公钥和私钥不足以真正验证签名。即使你已验证签名文件包含匹配的密钥对,你仍需要某种方法来确认公钥实际上来自它声称来自的签名者。

因此,需要一个元素来进行签名和验证工作。该附加元素是签名者在签名的 JAR 文件中包含的 certificate (证书)。证书是来自公认的 certification authority (证书颁发机构) 的数字签名语句,表明谁拥有特定的公钥。认证机构是整个行业内可信赖的实体(通常是专门从事数字安全的公司),用于为密钥及其所有者签署和颁发证书。对于签名的 JAR 文件,证书指示谁拥有 JAR 文件中包含的公钥。

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

总结数字签名:

摘要和签名文件

签署 JAR 文件时,归档中的每个文件都会在归档的 manifest 中获得摘要条目。以下是此类条目的示例:

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

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

签名 JAR 文件时,会自动生成 signature (签名) 文件并将其放在 JAR 文件的 META-INF 目录中,该目录包含存档的清单。签名文件的文件名扩展名为 .SF。以下是签名文件内容的示例:

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-Manifest 头)。

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

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

签名块文件

除了签名文件之外,当签署 JAR 文件时,signature block (签名块) 文件将自动放置在 META-INF 目录中。与清单文件或签名文件不同,签名块文件不是人类可读的。

签名块文件包含两个必要的验证元素:

签名块文件名通常具有 .DSA 扩展名,表示它们是由默认 Digital Signature Algorithm (数字签名算法)创建的。如果使用与其他标准算法相关联的密钥进行签名,则可以使用其他文件扩展名。


相关文档

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

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


Previous page: Signing and Verifying JAR Files
Next page: Signing JAR Files