JAR 文件揭密
JAR 的每一位签名者都由在 JAR 文件的 META-INF 目录中的一个具有 .SF 扩展名的签名文件表示。这个文件的格式类似于 manifest 文件 -- 一组 RFC-822 头。如下所示,它的组成包括一个主要部分,它包括了由签名者提供的信息、但是不特别针对任何特定的 JAR 文件项,还有一系列的单独的项,这些项也必须包含在 menifest 文件中。在验证一个签名的 JAR 时,将签名文件的摘要值与对 JAR 文件中的相应项计算的摘要值进行比较。
清单 1. 签名 JAR 中的 Manifest 和 signature 文件
您将使用下述命令为 JarIndex_Main.jar、JarIndex_test.jar 和 JarIndex_test1.jar 创建一个索引文件:
jar -i JarIndex_Main.jar JarIndex_test.jar SampleDir/JarIndex_test1.jar
?
INDEX.LIST 文件的格式很简单,包含每个已索引的 JAR 文件中包含的包或者类的名字,如清单 2 所示:
清单 2. JarIndex INDEX.LIST 文件示例
JarIndex-Version: 1.0 JarIndex_Main.jar sp JarIndex_test.jar Sample SampleDir/JarIndex_test1.jar org org/apache org/apache/xerces org/apache/xerces/framework org/apache/xerces/framework/xml4j
?
1. 签名前
通常情况下,在签名前META-INF目录下只有一个MANIFEST.MF文件,文件中只有很少的内容,例如:
Manifest-Version: 1.0
Main-Class: CreateFile
2. 签名后
签名后,会在META-INF目录下增加两个新的文件,一个是签名文件,后缀名为.SF;一个为签名块文件,后缀取决你签名时使用的算法,例如使用RSA来签名,那么这个签名块文件的后缀为.RSA。这两个文件的命名取决于签名时使用的alias,例如如果使用一个keystore的别名Minliang来做签名,那么这两个文件名均为MINLIANG。除此之外,原先的MANIFEST.MF文件也会被相应的更新。也就是说,在签名后,META-INF目录下的文件有:MANIFEST.MF,签名文件,签名块文件。
MANIFEST.MF:
签名时,把JAR包中除META-INF目录之外的所有文件的Message Digest信息添加到该文件中。这些信息与JAR包中的文件实体是一一对应的。例如:第一个digest信息是第一个文件的Message Digest,第二个digest信息是第一个文件和第二个文件内容之和的Message Digest,等等。在该文件中的信息并没有用密钥进行加密,而只是各个文件的Message Digest信息。
Manifest-Version: 1.0
Main-Class: CreateFile
Name: .classpath
SHA1-Digest: uPbF74ItpohxnbWsy2MpLImqtkA=
Name: CreateFile.class
SHA1-Digest: 0KIj80fzZUV4tgdrNE+luxnTsJY=
Name: FileWriter.class
SHA1-Digest: YGXJEXvSfZah/WM4TXFLKaoqYbA=
Name: .project
SHA1-Digest: U2Iniw7wANpE8+pMCgzUzIMHOnU=
签名文件:
一个签名文件就是一个MANIFEST.MF文件被签名的版本,通过该文件,Jar verifier 可以察觉任何的增加未签名文件的操作。签名文件在SHA1-Digest-Manifest头包含了MANIFEST.MF文件的message digest,此外还包含了在MANIFEST.MF文件所列出的各个文件的message digest。这与MANIFEST.MF文件的构成很相似,只不过签名文件中的message digest是基于MANIFEST.MF文件中的内容进行计算的,而MANIFEST.MF文件中的message digest是基于Jar包中的文件内容本身进行计算的。
Signature-Version: 1.0
SHA1-Digest-Manifest: h1yS+K9T7DyHtZrtI+LxvgqaMYM=
Created-By: SignatureFile JDK 1.2
Name: a/b/c1.class
SHA1-Digest: fcav7ShIG6i86xPepmitOVo4vWY=
Name: a/b/c2.class
SHA1-Digest: xrQem9snnPhLySDiZyclMlsFdtM=
签名块文件:
签名块文件必须随同签名文件一起创建。在该文件中,以不可读的格式纪录了与签名密钥相对应的公钥以及证书签名链。通过该签名块文件可以对Jar包中的文件进行检验。