Oracle「JAR文件規(guī)范」文檔翻譯(待完成)

前言


「JAR文件規(guī)范說明」文檔連接

為了更好地理解Android APK的JAR Signing v1簽名機制,專門了解JAR文件簽名的相關說明。
譯文的情況如下:

  • 章節(jié)目錄與文檔保持一致,但段落斷句稍有區(qū)別。
  • 有部分我認為是專用名詞,不會對其進行翻譯,以便在閱讀英文原文時候重點辨認和理解,例如:security, versioning, headers, attributs等。

正文


介紹

JAR文件,使用主流的ZIP文件格式,并整合多個文件為的一種格式。
一個JAR文件本質(zhì)上就是ZIP文件,可選地包含一個META-INF目錄。
在Java平臺可以通過 jar 工具,或者使用 java.util.jar API 創(chuàng)建一個JAR文件。
JAR的文件名并沒有格式限制,只要符合一般性的文件命名規(guī)范即可。
大部分情況下,JAR文件不僅僅只有 .class 文件或資源文件,往往是作為組成一個應用或應用擴展的一部分。
只要JAR文件內(nèi)存在META-INF 目錄,該目錄內(nèi)用作放置包和擴展的配置數(shù)據(jù),包括security,versioning,extensionservices

META-INF目錄

META-INF 目錄中的文件或子目錄,會被Java 2識別并配置 applications,extensions,類加載器services

  • MANIFEST.MF

manifest文件是用作定義擴展和包相關的數(shù)據(jù)。

  • INDEX.LIST

這個文件通過jar工具的"-i"命令參數(shù)創(chuàng)建。它包括一個包路徑信息。作為JarIndex實現(xiàn)的一部分,能加快類加載器的加載速度。

  • x.SF

這是JAR文件的簽名文件,‘x’代表文件名。

  • x.DSA

這是簽名塊文件,與簽名文件通過相同文件名進行對應。

  • services/

該目錄保存所有service提供者的配置文件。

Name-Value對和Sections

在我們開始了解上述配置文件細節(jié)前,需要闡明本規(guī)范文檔一些格式轉(zhuǎn)換規(guī)則。
在大部分情況下,manifest文件簽名文件中的信息,都會按照RFC882標準規(guī)范的名為"name: value對"(后面簡稱名值對)的形式編寫,又或者稱為headers或者attributes

多個名值對構(gòu)成的組群,稱為section。多個 Sections 之間通過空行進行分割

所有的文件二進制數(shù)據(jù)都會轉(zhuǎn)為 base64 字符串的格式。如果長度超過了72個字節(jié),需要連續(xù)不能截斷。二進制數(shù)據(jù)的樣例都是數(shù)字摘要和簽名。

所有實現(xiàn)需要支持headers值上限65535字節(jié)長度。

本文件中的所有規(guī)范都使用相同的語法,其中終端符號以固定寬度的字體顯示,非終端符號以斜體字表示。

文檔規(guī)范說明:

原文內(nèi)容:

section:            header +newline
nonempty-section:   +header +newline
newline:            CR LF | LF | CR(not floowed by LF)
header:             name:value
name:               alphanum *headerchar
value:              SPACE *otherchar newline *continuation
continuation:       SAPCE *otherchar newline
alphanum:           {A-Z|a-z|0-9} 
headerchar:         alphanum | - | _
otherchar:          any UTF-8 character except NUL, CR and LF

; Also: To prevent mangling of files sent via straight e-mail, no
; header will start with the four letters "From".  

譯文:

  • section 節(jié)信息 = (頭信息 + 1..*個換行
  • nonempty-section 非空的節(jié)信息= (1..頭信息 + 1..換行
  • newline 換行符 = (可使用:回車換行'\r\n' 或 換行'\n' 或 回車'\r'(但后面不能是換行符))
  • header 頭信息 = 名值對
  • name "名值對"的名 = 英文數(shù)字+ 0..*個合規(guī)首字符
  • value "名值對"的值 = 空格 + 0..個字符 + 1個換行符 + 0..值的延續(xù)部分
  • continuation 值的延續(xù)部分 = 空格 + 0..*個字符 + 1個‘換行符’
  • alphanum 英文數(shù)字 = {A-Z|a-z|0-9}
  • headerchar 合規(guī)首字符 = 英文數(shù)字 或者"短折線"或者“下劃線”`
  • otherchar= 不為NUL、回車符號換行符號的任意 UTF-8 編碼格式的字符

還有:為了阻止零碎文件通過不間斷的email發(fā)送,頭信息不能以"From",這四個字母開頭

上述定義的非終端符號規(guī)范,會在下文中使用。

JAR清單(Manifest)文件

概述

一個JAR文件的清單內(nèi)容組成:一個主section開頭,一組sections列表分別對應單個JAR實體文件。主sectionsections列表都遵從上述的關于section 節(jié)信息語法,有各自的限制和規(guī)則。

主section包含:
- 單個JAR文件、一個應用包或一個擴展包文件自身的安全與配置信息
- 每個獨立清單實例中,要應用的主要屬性
- 該section不能使用'name'作為名字的屬性。
- 使用空行作為本section內(nèi)容的結(jié)尾

sections列表
- JAR文件中包或子文件對應的清單內(nèi)容使用的各種屬性。
- 所有要被簽名的文件,都必須列出。
- 這個清單文件本身,一定不能在列表中
- 列表中的每個section必須使用名為"name"首個屬性的名字,值必須是文件的相對路徑,或者有效的外部資源URL。
- 假如sections列表列表中,有多個屬性指向同一個文件實例,那么這些屬性會被合并。
- 假如某一屬性在多個列表出現(xiàn),只有最后一個會被識別使用。
- 不能識別的屬性會被忽略
- 所有的屬性需要包括一個應用使用的實現(xiàn)規(guī)范信息

Manifest文件內(nèi)容規(guī)范

manifest文件: 主section + 換行符 + 0..獨立section
主section: 版本信息 + 換行符 + 0..
主屬性
版本信息: "Manifest-Version:" + 版本號碼
版本號碼: 數(shù)字 + 0...數(shù)字,即 “1“、”1.0“、”1.0.0“
主屬性: 任意合法的主屬性 + 換行符
獨立section: "Name:" + + 換行符 + 0..
單獨實例屬性
單獨實例屬性: 任意合法的主屬性 + 換行符
換行符: 可使用:回車換行'\r\n' 或 換行'\n' 或 回車'\r'(但后面不能是換行符)
數(shù)字: {0-9}

上述的規(guī)范格式:

  • 主屬性會被主section引用,單獨實例屬性會在獨立section引用。
  • 某一屬性可以同時在主section獨立section中出現(xiàn),但后者會覆蓋主section的屬性值。

下面分別說明兩種類型的屬性。

主屬性

主屬性是屬于主section的內(nèi)容,它們有以下的分組劃分:

  • 通用屬性

    • 'Manifest-Version':
    • 'Created-By':
    • 'Signature-Version':
    • 'Class-Path':
  • 獨立應用的屬性

    • 'Main-Class':
  • Java小部件的屬性(已過期):

    • 'Extension-List':(略)
    • "'extension'-Extension-Name":(略)
    • "'extension'-Specification-Version":(略)
    • "'extension'-Implementation-Name":(略)
    • "'extension'-Implementation-Vendor-Id":(略)
    • "'extension'-Implementation-URL":(略)
  • 擴展包標識的屬性

    • 'Extension-Name':
  • 擴展包版本信息和封裝信息的屬性

    • 'Implementation-Title':
    • 'Implementation-Version':
    • 'Implementation-Vendor':
    • 'Implementation-Vendor-Id'(已過期):(略)
    • 'Implementation-URL'(已過期):(略)
    • 'Specification-Title':
    • 'Specification-Vendor':
    • 'Sealed':

單獨實例屬性

簽名的JAR文件

關于簽名文件

簽名的校驗

魔法屬性

數(shù)字簽名

Manifest文件、簽名文件的注意點

JAR索引

服務提供者

類路徑屬性

包的封裝

API詳情

請參閱

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容