JAR文件揭密 | ||||||||||||||||||
作者:Pagadala J. Suresh 來自:IBM JAR 文件是什麼? 一個 JAR 文件可以用於: JAR 文件格式提供了許多優勢和功能,其中很多是傳統的壓縮格式如 ZIP 或者 TAR 所沒有提供的。它們包括: ☆ 安全性。 可以對 JAR 文件內容加上數字化簽名。這樣,能夠識別簽名的工具就可以有選擇地爲您授予軟件安全特權,這是其他文件做不到的,它還可以檢測代碼是否被篡改過。 ☆ 減少下載時間。 如果一個 applet 捆綁到一個 JAR 文件中,那麼瀏覽器就可以在一個 HTTP 事務中下載這個 applet 的類文件和相關的資源,而不是對每一個文件打開一個新連接。 ☆ 壓縮。JAR 格式允許您壓縮文件以提高存儲效率。 ☆ 傳輸平臺擴展。 Java 擴展框架(Java Extensions Framework)提供了向 Java 核心平臺添加功能的方法,這些擴展是用 JAR 文件打包的(Java 3D 和 JavaMail 就是由 Sun 開發的擴展例子)。 ☆ 包密封。 存儲在 JAR 文件中的包可以選擇進行密封,以增強版本一致性和安全性。密封一個包意味着包中的所有類都必須在同一 JAR 文件中找到。 ☆ 包版本控制。 一個 JAR 文件可以包含有關它所包含的文件的數據,如廠商和版本信息。 ☆ 可移植性。 處理 JAR 文件的機制是 Java 平臺核心 API 的標準部分。 壓縮的和未壓縮的 JAR META-INF 目錄 ☆ MANIFEST.MF。 這個 manifest 文件定義了與擴展和包相關的數據。 ☆ INDEX.LIST。 這個文件由 jar 工具的新選項 -i 生成,它包含在應用程序或者擴展中定義的包的位置信息。它是 JarIndex 實現的一部分,並由類裝載器用於加速類裝載過程。 ☆ xxx.SF。 這是 JAR 文件的簽名文件。佔位符 xxx 標識了簽名者。 ☆ xxx.DSA。 與簽名文件相關聯的簽名程序塊文件,它存儲了用於簽名 JAR 文件的公共簽名。 jar 工具 表 1. 常見的 jar 工具用法
可執行的 JAR 創建可執行 JAR Main-Class: com.mycompany.myapp.Sample 然後,像這樣創建 JAR 文件: jar cmf manifest ExecutableJar.jar application-dir 所要做的就是這些了 -- 現在可以用 java -jar 執行這個 JAR 文件 ExecutableJar.jar。 一個可執行的 JAR 必須通過 menifest 文件的頭引用它所需要的所有其他從屬 JAR。如果使用了 -jar 選項,那麼環境變量 CLASSPATH 和在命令行中指定的所有類路徑都被 JVM 所忽略。 啓動可執行 JAR java -jar ExecutableJar.jar 包密封 要密封包,需要在 JAR 的 manifest 文件中爲包添加一個 Name 頭,然後加上值爲“true”的 Sealed 頭。與可執行的 JAR 一樣,可以在創建 JAR 時,通過指定一個具有適當頭元素的 manifest 文件密封一個 JAR,如下所示: Name: com/samplePackage/ Name 頭標識出包的相對路徑名。它以一個“/”結束以與文件名區別。在 Name 頭後面第一個空行之前的所有頭都作用於在 Name 頭中指定的文件或者包。在上述例子中,因爲 Sealed 頭出現在 Name 頭後並且中間沒有空行,所以 Sealed 頭將被解釋爲只應用到包 com/samplePackage 上。 如果試圖從密封包所在的 JAR 文件以外的其他地方裝載密封包中的一個類,那麼 JVM 將拋出一個 SecurityException。 擴展打包 假設 extension1.jar 和 extension2.jar 是同一個目錄中的兩個 JAR 文件,extension1.jar 的 manifest 文件包含以下頭: Class-Path: extension2.jar 這個頭表明 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-Version: 1.0 在這個 manifest 中 Class-Path 頭的值是沒有指定路徑的 ExtensionDemo.jar,表明 ExtensionDemo.jar 與 ExtensionClient JAR 文件處在同一目錄中。 JAR 文件中的安全性 JAR 文件是用一個存儲在 Keystore 數據庫中的證書籤名的。存儲在 keystore 中的證書有密碼保護,必須向 jarsigner 工具提供這個密碼才能對 JAR 文件簽名。
JAR 的每一位簽名者都由在 JAR 文件的 META-INF 目錄中的一個具有 .SF 擴展名的簽名文件表示。這個文件的格式類似於 manifest 文件 -- 一組 RFC-822 頭。如下所示,它的組成包括一個主要部分,它包括了由簽名者提供的信息、但是不特別針對任何特定的 JAR 文件項,還有一系列的單獨的項,這些項也必須包含在 menifest 文件中。在驗證一個簽名的 JAR 時,將簽名文件的摘要值與對 JAR 文件中的相應項計算的摘要值進行比較。 清單 1. 簽名 JAR 中的 Manifest 和 signature 文件 Contents of signature file META-INF/MANIFEST.MF 數字簽名 Keystore 所有 keystore 項(密鑰和信任的證書項)都是用唯一別名訪問的。別名是在用 keytool -genkey 命令生成密鑰對(公鑰和私鑰)並在 keystore 中添加項時指定的。之後的 keytool 命令必須使用同樣的別名引用這一項。 例如,要用別名“james”生成一個新的公鑰/私鑰對並將公鑰包裝到自簽名的證書中,要使用下述命令: keytool -genkey -alias james -keypass jamespass 這個命令序列指定了一個初始密碼“jamespass”,後續的命令在訪問 keystore “jamesKeyStore”中與別名“james”相關聯的私鑰時,就需要這個密碼。如果 keystore“jamesKeyStore”不存在,則 keytool 會自動創建它。 jarsigner 工具 假設像上述例子那樣創建了 keystore “jamesKeyStore”,並且它包含一個別名爲“james”的密鑰,可以用下面的命令簽名一個 JAR 文件: jarsigner -keystore jamesKeyStore -storepass jamesKeyStorePass 這個命令用密碼“jamesKeyStorePass”從名爲“jamesKeyStore”的 keystore 中提出別名爲“james”、密碼爲“jamespass”的密鑰,並對 Sample.jar 文件簽名、創建一個簽名的 JAR -- SSample.jar。 jarsigner 工具還可以驗證一個簽名的 JAR 文件,這種操作比簽名 JAR 文件要簡單得多,只需執行以下命令: jarsigner -verify SSample.jar 如果簽名的 JAR 文件沒有被篡改過,那麼 jarsigner 工具就會告訴您 JAR 通過驗證了。否則,它會拋出一個 SecurityException, 表明哪些文件沒有通過驗證。 還可以用 java.util.jar 和 java.security API 以編程方式簽名 JAR(有關細節參閱參考資料)。也可以使用像 Netscape Object Signing Tool 這樣的工具。 JAR 索引 從 JDK 1.3 以後,JAR 文件格式開始支持索引以優化網絡應用程序中類的搜索過程,特別是 applet。JarIndex 機制收集在 applet 或者應用程序中定義的所有 JAR 文件的內容,並將這些信息存儲到第一個 JAR 文件中的索引文件中。下載了第一個 JAR 文件後,applet 類裝載器將使用收集的內容信息高效地裝載 JAR 文件。這個目錄信息存儲在根 JAR 文件的 META-INF 目錄中的一個名爲 INDEX.LIST 的簡單文本文件中。 創建一個 JarIndex
您將使用下述命令爲 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 結束語 |
JAR文件揭密
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.