要密封包,需要在JAR的manifest文件中为包添加一个Name头,然后加上为“true”的Sealed头。与可执行的JAR一样,可以在创建JAR时,通过指定一个具有适当头元素的manifest文件密封一个JAR,如下所示:
Name头标识出包的相对路径名。它以一个“/”结束以与文件名区别。在Name头后面第一个空行之前的所有头都作用于在Name头中指定的文件或者包。在上述例子中,因为Sealed头出现在Name头后并且中间没有空行,所以Sealed头将被解释为只应用到包com/samplePackage上。
如果试图从密封包所在的JAR文件以外的其他地方装载密封包中的一个类,那么JVM将抛出一个SecurityException。
扩展打包
扩展为Java平台增加了功能,在JAR文件式中已经加入了扩展机制。扩展机制使得JAR文件可以通过manifest文件中的Class-Path头指定所需要的其他JAR文件。
假设extension1.jar和extension2.jar是同一个目录中的两个JAR文件,extension1.jar的manifest文件包含以下头:
这个头表明extension2.jar中的类是extension1.jar中的类的扩展类。extension1.jar中的类可以调用extension2.jar中的类,并且不要求extension2.jar处在类路径中。
在装载使用扩展机制的JAR时,JVM会高效而自动地将在Class-Path头中引用的JAR添加到类路径中。不过,扩展JAR路径被解释为相对路径,所以一般来说,扩展JAR必须存储在引用它的JAR所在的同一目录中。
例如,假设类ExtensionClient引用了类ExtensionDemo ,它捆绑在一个名为ExtensionClient.jar的JAR文件中,而类ExtensionDemo则捆绑在ExtensionDemo.jar中。为了使ExtensionDemo.jar可以成为扩展,必须将ExtensionDemo.jar列在ExtensionClient.jar的manifest的Class-Path头中,如下所示:
在这个manifest中Class-Path头的是没有指定路径的ExtensionDemo.jar,表明ExtensionDemo.jar与ExtensionClient JAR文件处在同一目录中。
JAR文件中的安全性
JAR文件可以用jarsigner工具或者直接通过java.security API签名。一个签名的JAR文件与原来的JAR文件完全相同,只是更新了它的manifest,并在META-INF目录中增加了两个文件,一个签名文件和一个签名块文件。
JAR文件是用一个存储在Keystore中的证书签名的。存储在keystore中的证书有密码保护,必须向jarsigner工具提供这个密码才能对JAR文件签名。
图1. Keystore
JAR的每一位签名者都由在JAR文件的META-INF目录中的一个具有.SF扩展名的签名文件表示。这个文件的式类于manifest文件--一组RFC-822头。如下所示,它的组成包括一个主要部分,它包括了由签名者提供的信息、但是不特别针对任何特定的JAR文件项,还有一系列的单独的项,这些项也必须包含在menifest文件中。在验证一个签名的JAR时,将签名文件的摘要与对JAR文件中的相应项计算的摘要进行比较。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-41868-4.html
如果没有蛆