天天看點

【項目管理】軟體項目經理須知的 Java 8 安全知識目錄1、引言2、Java 語言安全和位元組編碼驗證3、基本安全架構4、密碼學5、公鑰基礎設施6、認證7、安全通訊8、通路控制9、XML 簽名10、更多資訊附 A、 類彙總附 B、工具彙總附 C、内置 Provider

【譯者按】作為軟體研發項目的項目經理,隻懂項目管理知識是不夠的,需要對軟體技術本身有基本的了解。Java 是一種主流的系統開發語言,其安全設計對于建構安全的資訊系統有至關重要的意義。項目經理了解 Java安全知識的好處在于:
  • 能與研發工程師有效溝通
  • 指導或提醒研發工程師善用 Java安全體系
  • 了解技術邊界,平衡需求和實作

目錄

1、引言
2、Java 語言安全和位元組編碼驗證
3、基本安全架構
4、密碼學
5、公鑰基礎設施
6、認證
7、安全通訊
8、通路控制
9、XML簽名
10、更多資訊
           

1、引言

Java 平台的設計着重關注了安全。在其核心,Java 語言自身是類型安全的,提供自動垃圾回收,以增強應用代碼的健壯性。安全的類加載和驗證機制保證隻有合法的 Java 代碼被執行。

Java 平台早期版本為潛在不可信的代碼建立了一個安全的環境,如從公網上下載下傳Java applet。随着平台的發展,以及其部署範圍的擴充,Java 安全架構也響應的進行了更新進化,以支撐增長的服務需求。今天該架構包含了大量應用程式開發接口、工具和通用安全算法的實作、機制和協定。它為開發者編寫應用,提供給了一套綜合的安全架構,同時提供給使用者或管理者一套安全管理應用的工具。

Java 安全 API 涉及非常廣泛的領域。密碼和公鑰基礎設施(PKI)接口為開發安全的應用提供了基礎。認證和通路控制的接口使應用系統可以防護來自非授權的通路受保護的資源。

這些API允許算法和其他安全服務之間有多樣的互相協作操作。提供服務都在 provider 中執行,後者基于一種标準接口可以插入 Java 平台,這種設計讓應用可以友善的擷取安全服務,同時又不必了解它們的實作細節。這使得開發者聚焦于如何将安全內建到他們的應用,而不用實際實作複雜的安全機制。

Java 平台包括了很多 Provider,它們實作了一組核心安全服務。它允許安裝使用者自定義的 Provider。這使得開發者可以擴充平台,支援新的安全機制。

本文提供了 Java 平台安全一覽,包括安全語言特性到安全 API、工具、内置的 Priovider 服務、實用的備受矚目的關鍵包和類。注意:本文是基于 Java SE v8。

2、Java 語言安全和位元組編碼驗證

Java 語言從設計上就是類型安全和易于使用。它支援自動記憶體管理、垃圾回收、數組邊界檢測。這些降低了開發者的負擔,編碼進而更不易出錯,也更安全、更健壯。

另外,Java 語言定義了不同的通路修飾符,可以用于限制 Java 類、方法、字段,使開發者嚴格限制他們的類的恰當的執行。尤其是語言定義了四種清晰的通路級别:private,保護,公共,包(預設值)。最開放的通路訓示符是public ,它允許任何人通路。最嚴格的修飾符是 private,它不允許外界通路特定内的内部成員(如方法)。protected 修飾符允許子類或在同一包的其他類通路。包級通路僅允許同一包的類間通路。

編譯器将 Java 程式翻譯成機器無關的位元組碼形式。位元組碼校驗器用于保證隻有合法的位元組碼在 Java 運作時中執行。它檢查位元組碼是否符合 Java 語言規範,是否與語言規則、命名空間限制沖突。校驗器還檢查記憶體管理違例、棧溢出或下溢、非法的資料類型轉換。一旦位元組碼驗證通過,Java 運作時将準備運作它。

3、基本安全架構

Java 平台定義了一組橫跨主要安全領域的 API,包括密碼、公鑰基礎設施、安全通訊、通路控制。這些 API 允許開發者很容易的将安全內建到他們的應用代碼中。它們的設計遵循以下原則:

  • 運作獨立性:應用不需要實作安全本身。應用可以從 Java 平台請求安全服務。安全服務運作在 Provider 中(見下),它們通過标準接口插入 Java 平台。一個應用可以使用多個獨立的 Provider 以實作不同的安全功能。
  • 實作互操作性:跨應用時 Provider 是可以互操作的。特别是,應用不會限定在特定的 Provider,Provider 也不會綁定在特定的應用。
  • 算法擴充性:Java 平台提供了大量的内置的 Provider,它們實作了一套廣泛使用的基礎安全服務。然而,仍有一些應用需要的新興的标準或專有服務沒有支援。Java 平台支援安裝使用者自定義的此類服務的 Provider。

安全 Provider

在 Java 平台,類java.security.Provider封裝了安全 Provider 的概念。它規定了 Provider 的名字,列出了它實作的安全服務。多個 Provider 可以同時配置,并列出優先級。當請求安全服務時,高優先級的 Provider 所實作的服務會被執行。

應用依靠相關的 getInstance 方法以從下層的 Provider 擷取安全服務。例如,消息摘要生成代表 Provider 對外可用的一類服務。(第4節讨論資訊摘要和其他加密服務)。應用觸發 getInstance 方法(在 java.security.MessageDigest 類中)以擷取特定消息摘要算法的執行,如 SHA-256。

MessageDigest md = MessageDigest.getInstance(“SHA-256”);

程式可通過指定 Provider 的名字,來選擇請求執行特定的 Provider,如下:

MessageDigest md = MessageDigest.getInstance(“SHA-256”,”Provider”);

圖1和圖2說明了請求 SHA-256消息摘要執行的這些選項。這兩張圖展示了三個 Provider 執行消息摘要算法。Provider 按優先級從左到右排列。圖1中,應用請求執行 SHA-256算法而沒有指定 Provider 的名字,此時按優先級搜尋Provider,能提供指定算法的 第一個Provider 将會執行,是以 ProviderB 将會傳回。圖2中,應用請求執行 SHA-256算法,并指定了Provider 即 ProviderC。此時,這個 Provider 的執行将傳回,即使更高優先級的 ProviderB 也提供了 SHA-256的實作。

【項目管理】軟體項目經理須知的 Java 8 安全知識目錄1、引言2、Java 語言安全和位元組編碼驗證3、基本安全架構4、密碼學5、公鑰基礎設施6、認證7、安全通訊8、通路控制9、XML 簽名10、更多資訊附 A、 類彙總附 B、工具彙總附 C、内置 Provider

圖1 搜尋Provider

【項目管理】軟體項目經理須知的 Java 8 安全知識目錄1、引言2、Java 語言安全和位元組編碼驗證3、基本安全架構4、密碼學5、公鑰基礎設施6、認證7、安全通訊8、通路控制9、XML 簽名10、更多資訊附 A、 類彙總附 B、工具彙總附 C、内置 Provider

圖2 請求特定的 Provider

Oracle 釋出的Java平台提供了大量預先配置好的預設的 Provider,它們實作了一套應用所使用的基礎安全服務。需要注意的是,不同廠商的 Java 平台發型版可能包含不同廠商特定的安全服務的封裝。本文所提到的内置預設 Provider,都是指 Oracle 發型版中可用的。

下面的小節涉及很多安全領域(密碼,認證等),每個都包含了預設 Provider 所提供的相關服務的描述。附件 C 中的表 A 總結了所有的預設的 Provider。

檔案位置

本文提到的關于 Java 安全的一些内容(包括配置 Provider)可以通過設定安全屬性來定制化。你可以靜态的在安全屬性檔案中設定安全屬性,它預設的是 java.security,在目錄 lib/security 中(在安裝 Java 運作環境 JRE 的路徑下)。安全屬性也可以動态設定,即調用适當類 Security 中的方法(在 java.security 包中)。

本文提到的工具及指令均在目錄jre/bin,此處jre 代表 JRE 的安裝目錄。第5節提到的cacert 檔案在~jre/lib/security。

4、密碼學

Java 密碼學架構是一套面向 Java 平台的架構,提供通路和開發密碼應用功能。它包括密碼應用服務所用的 API,如下:

  • 消息摘要算法
  • 數字簽名算法
  • 對稱分組加密算法
  • 對稱流式加密算法
  • 非對稱加密算法
  • 基于密碼的加密
  • 橢圓曲線加密算法
  • 秘鑰協商算法
  • 秘鑰生成算器
  • 消息認證碼(MAC)
  • (僞)随機數生成器

由于曆史的原因(出口控制),密碼 API 組織成兩個獨立的包。java.security 包包含不受出口限制的類(如簽名、消息摘要)。javax.crypto包包含受出口限制的類(如加密、秘鑰協商)。

密碼接口是基于 Provider,允許多個、可互相操作的加密技術實作。一些 Provider 可以在軟體中執行加密操作,另一些Provider 的運作則是依靠硬體令牌(例如,基于智能加卡裝置,硬體加密加速器)。Provider如涉及出口管制的服務,則必須數字簽名。

Java 平台為最通用的密碼算法提供了内置的 Provider,包括 RSA、DSA、ECDSA 簽名算法,DES、AES、ARCFOUR 加密算法,MD5、SHA-1、SHA-256消息摘要算,Diffie-Hellman、ECDH 秘鑰協商算法。這些預設的 Provider 均以 Java 代碼來實作密碼算法。

Java 平台還提供了一個特殊的内置 Provider,它充當與本地 PKCS#11(v2.x)令牌的橋梁。這個 Provider 的名字是 SunPKS11,它允許Java 應用無縫的通路由相容 PKCS#11的令牌所提供的密碼服務。

在Windows 上,Java 平台也提供了一個内置 Provider,用于橋接本地的微軟CryptoAPI。這個 Provider 的名字是 SunMSCAPI,它允許 Java 應用在 Windows 上,通過 CryptoAPI無縫的通路密碼服務。

5、公鑰基礎設施

公鑰基礎設施(PKI)是一個架構的術語,用來保證基于公鑰秘密碼技術實作安全的資訊交換。它允許實體(人、組織等)與數字證書綁定,提供了一套驗證證書認證的方法。PKI包括秘鑰、認證、公鑰加密、可信證書認證(CA),CA 負責生成和簽署數字證書。

Java 平台所包含的 API 和 Provider 支援 X.509 數字證書和證書吊銷清單(CRL),以及 相容PKIX的證書目錄建立與驗證。與 PKI 相關的類位于 java.security和java.security.cert包。

秘鑰和證書存儲

Java平台使用秘鑰和證書存儲來支援長期持久的加密秘鑰和證書的存儲需求。特别的是,類java.security.KeyStore代表秘鑰存儲、安全密碼秘鑰倉庫、可信證書(如在證書路徑驗證使用)。類java.security.cert.CertStore代表證書存儲、面向無關和典型不可信證書的公共潛在的大型倉庫。CertStore可能會存儲 CRL。

KeyStore 和 CertStore 實作按類型區分。Java 平台支援标準的 PKCS11和 PKCS12的秘鑰存儲類型,它們的實作相容相應的 PKCS 規格(RSA 安全)。它還包括了一個基于專有檔案的秘鑰存儲類型,JKS(Java Key Store)和 DKS(Domain Key Store),後者是一個秘鑰存儲集合,代表了一個獨立的邏輯秘鑰存儲。

Java 平台提供了一個特殊的内置 JKS 秘鑰存儲 cacerts,其包含了很多公認的可信的 CA 的證書。工具keytool可以列出 cacerts 中的證書(見第10節安全特性文檔連結)。

第4節提到的SunPKCS11 Provider 實作了 PKCS11 KeyStore。這意味着借助 KeyStore API Java 應用可以通路屬于安全硬體(如智能卡)的秘鑰和證書。需要提醒的是,智能卡的秘鑰可能不允許離開裝置。在這種情況下,KeyStore API 可能簡單傳回 java.security.Key 對象應用,即隻是秘鑰的引用,而不是包含實際秘鑰本身。這樣的Key 對象隻能在裝置上執行加密運算,實際的秘鑰駐留在裝置上。

Java 平台還支援 LDAP 證書存儲類型(通路存在 LDAP 目錄中的證書)和記憶體Collection證書存儲類型(通路由java.util.Collection對象管理的證書)。

PKI工具

有兩種内置工具可配合秘鑰、證書、秘鑰存儲工作:

keytool 用于建立和管理秘鑰存儲,它支援:

  • 建立公鑰私鑰對
  • 顯示、導入、導出 X.509 v1,v2,v3 證書并存為檔案
  • 建立自簽名證書
  • 釋出可發送給 CA 的證書(PKCS#10)
  • 基于證書請求隻做證書
  • 導入證書副本(從 CA 獲得)
  • 指定可信的公鑰證書
  • 接收密碼并以秘鑰形式安全存儲

jarsinger 工具用于對 JAR 檔案進行簽名,也可以驗證JAR 檔案的簽名。Java ARchive(JAR)檔案格式将多個檔案打包成一個檔案。典型的 JAR 檔案包含類檔案、applet和應用需要的附加的資源檔案。當你需要數字簽名碼時,你手下要用 keytool 生成或導入對應的秘鑰和證書到你的秘鑰存儲(如果它們之前不在那裡),之後使用 jar 工具将碼放入到 JAR 檔案中,最後使用 jarsigner 工具去簽名 JAR 檔案。jarsigner 工具通路秘鑰存儲,可以查找任意秘鑰和證書,以便于對 JAR 檔案簽名或驗證其簽名的有效性。注意:jarsigner 可以選擇生成簽名并包含時間戳。驗證 JAR 檔案簽名的系統(如 Java Plug-in)可以檢查時間戳,接受簽名曾經有效的 JAR 檔案,而不是要求證書現在有效。(證書通常每年都會過期,沒有理由期望 JAR 檔案建立者每年重新簽名并部署 JAR 檔案)。

6、認證

認證是檢測使用者身份的過程。在 Java 運作環境中,它是指确認執行的 Java 程式的使用者。在一些特定的情況下,這個過程依賴于第4節所介紹的密碼服務。

Java 平台提供 API 使應用可用借助可插拔的子產品顯示使用者認證。應用調用 LoginContext 類(在包 javax.security.auth.login),它将傳回配置的引用。這個配置指定哪個登入子產品(接口javax.security.auth.spi.LoginModule的一個實作)會被用于執行實際的認證。

由于應用是獨立通路标準的 LoginContext 接口,是以他們保持與下層可插拔子產品的獨立性。新的或更新的子產品可以根據應用需要插入,而不必修改應用本身。圖3說明了應用與下層登入子產品的的獨立性。

【項目管理】軟體項目經理須知的 Java 8 安全知識目錄1、引言2、Java 語言安全和位元組編碼驗證3、基本安全架構4、密碼學5、公鑰基礎設施6、認證7、安全通訊8、通路控制9、XML 簽名10、更多資訊附 A、 類彙總附 B、工具彙總附 C、内置 Provider

圖3 認證登入子產品插入認證架構

有一點很重要,雖然登入子產品是可插拔的元件,可以通過配置接入 Java 平台,但他們并不是通過安全 Provider 接入的。是以,它們不遵循第3節所描述的 Provider 搜尋模型(上圖),登入模型由各自的唯一的配置來管理。

Java 平台提供了以下内置的登入子產品,它們都在包 com.sun.security.auth.module中:

  • Krb5LoginModule 使用 Kerberos 協定認證
  • JndiLoginModule 使用 LDAP、NIS 資料庫進行使用者/密碼認證
  • KeyStoreLoginModule 登入任意類型的秘鑰存儲,包括 PKCS#11令牌秘鑰存儲

在兩個節點間建立安全通訊時,認證也可完成。Java 平台提供了很多标準通訊協定的實作,這将在下一節讨論。

7、安全通訊

資料通過網絡傳輸,有可能被不是預期的接收者擷取。當這些資料包含私有資訊(如密碼、信用卡号),必須采取措施讓未授權的其他方不能了解這些資料。同樣重要的是,確定在你發送資料給相應的接收者時,這些資料在傳輸過程中,不會被有意或無意的修改。

加密是安全通訊的基本要求,見第4節。針對很多标準的安全通訊協定,Java 平台也提供了 API 支援和 Priovider 實作。

SSL/TLS

Java平台提供了 SSL、TLS 協定的 API 及實作,包括資料加密功能、消息完整性、伺服器認證、可選的用戶端認證。應用可以使用 SSL/TLS來為通訊雙方提供安全的資料通道,可支援任意的應用協定,如 基于 TCP/IP 的HTTP。

類javax.net.ssl.SSLSocekt在正常流式套接字(java.net.Socket)上封裝了 SSL/TLS的支援。一些應用可能想使用交替的資料傳輸抽象(如 New-I/O),類 javax.net.ssl.SSLEngine 可用用來生産和消費 SSL/TLS 包。

Java 平台提供了 API 來支援可插拔的秘鑰管理器和信任管理器,這些是基于 Provider 的。一個秘鑰管理器是由 javax.net.ssl.KeyManager 封裝,管理用于認證的秘鑰。信任管理器就是由 類TrustManager(相同的包)封裝,根據其管理的秘鑰存儲中的證書來決定誰被信任。

Java 平台提供的内置 Provider 實作 SSL/TLS協定:

  • SSLv3
  • TLSv1
  • TLSv1.1
  • TLSv1.2

SASL

簡單認證與安全層 Simple Authentication and Security Layer (SASL)是一個網際網路标準,它詳細規範了用戶端與服務應用間的認證和可選的安全層的建立。SASL 定義了如何互動認證資料,并沒有限定資料内容。它是一套規範認證機制的架構,這些機制規定了内容及認證資料可以支援的語義。标準 SASL 機制衆多,它們由網際網路社群根據不同的安全級别和部署場景而制定。

Java SASL API 為使用 SASL 機制的應用,定義了類、接口。它們是機制中立的,使用這些 API 的應用不必綁定使用任何特定的 SASL 機制。應用可以根據需要的安全特色來選擇合适的機制。API 即支援用戶端應用,也支援伺服器端應用。類javax.security.sasl.Sasl可用來建立 SaslClient 和SaslServer對象。

SASL 機制在 Provider 包中實作。每個 Provider 可以支援一個或多個 SASL 機制,每個 Provider 可以通過标準的 Provider 架構來注冊和觸發。

Java 平台提供了支援以下 SASL 機制的内置 Provider。

  • CRAM-MD5,DIGEST-MD5,EXTERNAL,GSSAPI,NTLM,PLAIN 用戶端機制
  • CRAM-MD5,DIGEST-MD5,GSSAPI,NTLM 服務端機制

GSS-API 與 Kerberos

Java平台提供了API 以便于 Java 語言友善通路通用安全服務應用開發接口(GSS-API)。GSS-API 提供給應用開發人員統一的方法通路基于安全機制建構的安全服務。Java GSS-API 目前需要使用 Keberos v5 機制,Java 平台提供了該機制的内置實作。現在,還不能插入附加的機制。注意:第6節提到的Krb5LoginModule與 GSS Kerberos 機制一起使用。

Java 平台内置實作了 Simple and Protected GSSAPI Negotiation Mechanism(SPNEGO) GSS-API 機制。

兩個應用要使用 Java GSS-API 安全交換資訊,必須建立公共的安全上下文。這個上下文包含了共享的正式資訊,例如可能包括加密秘鑰。應用都建立和試用org.ietf.jgss.GSSContext對象來建立和維護組成安全上下文的共享資訊。一旦安全上下文建立,它可以用來準備要交換的安全資訊。

Java GSS API 位于org.ietf.jgss包中。Java 平台還定義了基礎的 Kerberos 類,如 KerberosPrincipal,KerberosTicket,KerberosKey,KeyTab,這些都位于包javax.security.auth.kerberos 中。

8、通路控制

Java 平台的通路控制架構保護對敏感資源(如本地檔案)、敏感應用代碼(如類中的方法)的通路。所有通路控制的決定都是有安全管理器裁決的,它就是累java.lang.SecurityManager。為了激活通路控制檢查,SecurityManager 必須安裝在 Java 運作時中。

Java applet 和 Java Web Start 應用與 安裝的SecurityManager一起自動運作。然而,通過 java 指令運作本地應用預設是不與安裝的 SecurityManager 一起運作。為了讓本地應用與 SecurityManager 一起運作,有兩種方法,或者應用自身通過 setSecurityManager 方法(在類java.lang.System中)來設定,或者 java 觸發時在指令行中增加參數 -Djava.security.manager。

許可

類加載器将 Java 代碼加載Java 運作時,同時會自動将此代碼與以下資訊建立關聯:

  • 代碼從哪裡加載的
  • 誰簽名該代碼(如果有)
  • 該代碼的預設許可

無論代碼是從不可信網絡下載下傳的(如 applet)還是從檔案系統加載(如本地應用),這些資訊都會與代碼關聯起來。代碼被加載的路徑用 URL 表示,代碼簽名用簽名者證書連結清單示,預設許可用java.security.Permission 對象來表示。

下載下傳的代碼的預設許可會自動的增加通路其下載下傳源的網絡連接配接權限。從本地檔案加載的代碼的預設許可會自動賦予讀取器所在路徑其他檔案的能力,也包括子檔案夾。

注意:在類加載階段,不能确認執行代碼的使用者身份。如果需要,應用代碼要自己認證最終使用者(如見第6節)。一旦使用者通過認證,應用會通過調用 doAS 方法(java.security.auth.Subject類)将執行代碼的使用者與其關聯。

政策

如之前提到的,類加載器會授予代碼一組有限的預設許可集合。管理者需要能借助安全政策,靈活的管理附加的代碼許可。

Java 平台将安全政策的概念封裝在類java.security.Policy中。在任何時間,它都是java 運作時中唯一的 Policy 對象。Policy 對象基本的職責是,檢測是否允許代碼通路受保護的資源(這由其被加載的位置、誰簽名及誰執行決定)。Policy 對象如何做決定是與實作無關的。例如,它可以查詢包括授權代碼的資料庫,也可以聯系另一個服務。

Java 平台的預設 Policy 實作是從一個或多個 ASCII(UTF-8)檔案中讀取認證資料,這些檔案是配置在安全屬性檔案中的。這些政策檔案包括賦予代碼的精确許可集合:特别的是,當代碼從特别的位置加載,由特别的實體簽名,由特别的使用者執行,都會賦予準确的許可集合。每個檔案中的政策實體必須遵循成文的專用文法,也可以使用純文字便器或者圖形化工具 policytool 來編寫。

通路控制增強

Java 運作時跟蹤程式執行産生的 Java 調用序列。當通路受保護資源時,預設的整個調用棧會被評估是否允許該通路申請。

如之前提到的,資源由 SecurityManager 來保護。以下是Java 平台和應用的安全敏感代碼保護通路資源的代碼示例:

SecurityManager sm = System.getSecurityManager(); if ( sm != null ) { sm.checkPermission( perm); }

perm 是對應通路請求的許可對象。例如,如果嘗試讀取檔案/temp/abc,許可可能如下構造:

Permission perm = new java.io.FilePermission( “/tmp/abc”, “read" );

預設的 SecurityManager 實作授權java.security.AccessController 實作來完成決定。AccessController周遊調用棧,将安裝的安全 Policy 和通路的許可,傳遞給棧中的每個代碼元素(如,上面例子中的 FilePermission)。Policy 根據管理者配置的許可決定請求的通路是否被授權。如果通路沒有被授權,AccessController 會抛出java.lang.SecurityExcepion。

圖4 展示了通路控制增強。在這個具體的例子中,在調用堆棧中有兩個初始元素,ClassA 和 ClassB。ClassA調用ClassB 的方法,該方法建立java.io.FileInputStream 的執行個體,嘗試通路檔案/tmp/abc。

FileInputStream 構造器建立了上面的 FilePermission,perm,然後将 perm 傳給 SecurityManager的 checkPermission方法。在這個具體的示例中,隻需要檢查ClassA 和 ClassB的許可,這是因為所有系統代碼,包括 FileInputStream、SecurityManager和 AccessController,會自動獲得所有許可。

在這個例子中,ClassA 和 ClassB 代碼特征不同,他們來自不同的位置和不同的簽名者。每個都被賦予不同的許可集合。如果 Policy 指出兩個類都被賦予需要 FilePermission,AccessController 隻會授權通路需要的檔案。

【項目管理】軟體項目經理須知的 Java 8 安全知識目錄1、引言2、Java 語言安全和位元組編碼驗證3、基本安全架構4、密碼學5、公鑰基礎設施6、認證7、安全通訊8、通路控制9、XML 簽名10、更多資訊附 A、 類彙總附 B、工具彙總附 C、内置 Provider

圖4 控制對資源的通路

9、XML 簽名

Java XML 數字簽名 API 是用于生成和驗證 XML 簽名的标準 Java API。

XML 簽名可以用于任意資料類型,包括 XML 和二進制(見*

http://www.w3.org/TR/xmldsig-core/

*)。簽名的結果也是 XML 形式的。XML 簽名可用于保證資料安全,提供資料完整性保護、消息認證、簽名認證。

該API 設計支援 W3C 關于 XML 簽名文法及處理的推薦中所有必須的和推薦的特性。這套 API 也可擴充和可插拔的,是基于 Java 密碼服務 Provider 架構。

Java XML數字簽名 API 由以下包組成:

  • javax.xml.crypto
  • javax.xml.crypto.dsig
  • javax.xml.crypto.dsig.keyinfo
  • javax.xml.crypto.dsig.spec
  • javax.xml.crypto.dom
  • javax.xml.crypto.dsig.dom

10、更多資訊

更多的 Java安全文檔可以線上的檢視 Java SE Security 和 書《Inside Java 2 Platform Security, Second Edition:Architecture , API Design and Implementation》。

注意:曆史上,新類型的安全服務被加入到 Java 平台(有時開始隻是擴充),不同的首字母縮寫詞被用于指代他們。由于這些縮寫詞仍然會被使用在 Java 安全文檔中,是以這裡有一份他們的含義清單:JSSE(Java Secure Socket Extension)指 SSL 相關的服務(第7節),JCE(Java 加密擴充)指加密服務(第4節),JAAS(Java Authentication and Authorization Service)指認證和基于使用者的通路控制服務(第6、8節)。

附 A、 類彙總

表1 總結了本文提到的安全類和接口的名稱、包和用途。

表1 關鍵 Java 安全包和類

Package Class/Interface Name Usage
com.sun.security.auth.module JndiLoginModule Performs username/password authentication using LDAP or NIS
KeyStoreLoginModule Performs authentication based on key store login
Krb5LoginModule Performs authentication using Kerberos protocols
java.lang SecurityException Indicates a security violation
SecurityManager Mediates all access control decisions
System Installs the SecurityManager
java.security AccessController Called by default implementation of SecurityManager to make access control decisions
DomainLoadStoreParameter Stores parameters for the Domain keystore (DKS)
Key Represents a cryptographic key
KeyStore Represents a repository of keys and trusted certificates
MessageDigest Represents a message digest
Permission Represents access to a particular resource
PKCS12Attribute Supports attributes in PKCS12 keystores
Policy Encapsulates the security policy
Provider Encapsulates security service implementations
Security Manages security providers and security properties
Signature Creates and verifies digital signatures
java.security.cert Certificate Represents a public key certificate
CertStore Represents a repository of unrelated and typically untrusted certificates
CRL Represents a CRL
javax.crypto Cipher Performs encryption and decryption
KeyAgreement Performs a key exchange
javax.net.ssl KeyManager Manages keys used to perform SSL/TLS authentication
SSLEngine Produces/consumes SSL/TLS packets, allowing the application freedom to choose a transport mechanism
SSLSocket Represents a network socket that encapsulates SSL/TLS support on top of a normal stream socket
TrustManager Makes decisions about who to trust in SSL/TLS interactions (for example, based on trusted certificates in key stores)
javax.security.auth Subject Represents a user
javax.security.auth.kerberos KerberosPrincipal Represents a Kerberos principal
KerberosTicket Represents a Kerberos ticket
KerberosKey Represents a Kerberos key
KerberosTab Represents a Kerberos keytab file
javax.security.auth.login LoginContext Supports pluggable authentication
javax.security.auth.spi LoginModule Implements a specific authentication mechanism
javax.security.sasl Sasl Creates SaslClient and SaslServer objects
SaslClient Performs SASL authentication as a client
SaslServer Performs SASL authentication as a server
org.ietf.jgss GSSContext Encapsulates a GSS-API security context and provides the security services available via the context

附 B、工具彙總

表2彙總本文提到的工具。

表2 Java 安全工具

Tool
jar Creates Java Archive (JAR) files
jarsigner Signs and verifies signatures on JAR files
keytool Creates and manages key stores
policytool Creates and edits policy files for use with default Policy implementation

還有3個用于 Windows 系統的 Java 平台的 Kerberos 相關工具。相應功能的同名工具也是 Solaris 和 Linux 操作環境的組成部分。表3彙總了 Kerberos 工具。

kinit Obtains and caches Kerberos ticket-granting tickets
klist Lists entries in the local Kerberos credentials cache and key table
ktab Manages the names and service keys stored in the local Kerberos key table

附 C、内置 Provider

Oracle 版Java 平台提供大量的内置的 Provider 包。更多細節,見Java Cryptography Architecture Oracle Provider Documentation。

原文:

Java Security Overview