【項目管理】軟件項目經(jīng)理須知的 Java 8 安全知識

【譯者按】作為軟件研發(fā)項目的項目經(jīng)理,只懂項目管理知識是不夠的,需要對軟件技術(shù)本身有基本的了解。Java 是一種主流的系統(tǒng)開發(fā)語言,其安全設(shè)計對于構(gòu)建安全的信息系統(tǒng)有至關(guān)重要的意義。項目經(jīng)理了解 Java安全知識的好處在于:

  • 能與研發(fā)工程師有效溝通
  • 指導或提醒研發(fā)工程師善用 Java安全體系
  • 理解技術(shù)邊界,平衡需求和實現(xiàn)

目錄

1、引言
2、Java 語言安全和字節(jié)編碼驗證
3、基本安全框架
4、密碼學
5、公鑰基礎(chǔ)設(shè)施
6、認證
7、安全通訊
8、訪問控制
9、XML簽名
10、更多信息

1、引言

Java 平臺的設(shè)計著重關(guān)注了安全。在其核心,Java 語言自身是類型安全的,提供自動垃圾回收,以增強應用代碼的健壯性。安全的類加載和驗證機制保證只有合法的 Java 代碼被執(zhí)行。

Java 平臺早期版本為潛在不可信的代碼創(chuàng)建了一個安全的環(huán)境,如從公網(wǎng)上下載Java applet。隨著平臺的發(fā)展,以及其部署范圍的擴展,Java 安全架構(gòu)也響應的進行了升級進化,以支撐增長的服務需求。今天該框架包含了大量應用程序開發(fā)接口、工具和通用安全算法的實現(xiàn)、機制和協(xié)議。它為開發(fā)者編寫應用,提供給了一套綜合的安全框架,同時提供給用戶或管理員一套安全管理應用的工具。

Java 安全 API 涉及非常廣泛的領(lǐng)域。密碼和公鑰基礎(chǔ)設(shè)施(PKI)接口為開發(fā)安全的應用提供了基礎(chǔ)。認證和訪問控制的接口使應用系統(tǒng)可以防護來自非授權(quán)的訪問受保護的資源。

這些API允許算法和其他安全服務之間有多樣的相互協(xié)作操作。提供服務都在 provider 中執(zhí)行,后者基于一種標準接口可以插入 Java 平臺,這種設(shè)計讓應用可以方便的獲取安全服務,同時又不必了解它們的實現(xiàn)細節(jié)。這使得開發(fā)者聚焦于如何將安全集成到他們的應用,而不用實際實現(xiàn)復雜的安全機制。

Java 平臺包括了很多 Provider,它們實現(xiàn)了一組核心安全服務。它允許安裝用戶自定義的 Provider。這使得開發(fā)者可以擴展平臺,支持新的安全機制。

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

2、Java 語言安全和字節(jié)編碼驗證

Java 語言從設(shè)計上就是類型安全和易于使用。它支持自動內(nèi)存管理、垃圾回收、數(shù)組邊界檢測。這些降低了開發(fā)者的負擔,編碼進而更不易出錯,也更安全、更健壯。

另外,Java 語言定義了不同的訪問修飾符,可以用于限制 Java 類、方法、字段,使開發(fā)者嚴格限制他們的類的恰當?shù)膱?zhí)行。尤其是語言定義了四種清晰的訪問級別:private,保護,公共,包(缺省值)。最開放的訪問指示符是public ,它允許任何人訪問。最嚴格的修飾符是 private,它不允許外界訪問特定內(nèi)的內(nèi)部成員(如方法)。protected 修飾符允許子類或在同一包的其他類訪問。包級訪問僅允許同一包的類間訪問。

編譯器將 Java 程序翻譯成機器無關(guān)的字節(jié)碼形式。字節(jié)碼校驗器用于保證只有合法的字節(jié)碼在 Java 運行時中執(zhí)行。它檢查字節(jié)碼是否符合 Java 語言規(guī)范,是否與語言規(guī)則、命名空間限制沖突。校驗器還檢查內(nèi)存管理違例、棧溢出或下溢、非法的數(shù)據(jù)類型轉(zhuǎn)換。一旦字節(jié)碼驗證通過,Java 運行時將準備運行它。

3、基本安全框架

Java 平臺定義了一組橫跨主要安全領(lǐng)域的 API,包括密碼、公鑰基礎(chǔ)設(shè)施、安全通訊、訪問控制。這些 API 允許開發(fā)者很容易的將安全集成到他們的應用代碼中。它們的設(shè)計遵循以下原則:

  • 運行獨立性:應用不需要實現(xiàn)安全本身。應用可以從 Java 平臺請求安全服務。安全服務運行在 Provider 中(見下),它們通過標準接口插入 Java 平臺。一個應用可以使用多個獨立的 Provider 以實現(xiàn)不同的安全功能。
  • 實現(xiàn)互操作性:跨應用時 Provider 是可以互操作的。特別是,應用不會限定在特定的 Provider,Provider 也不會綁定在特定的應用。
  • 算法擴展性:Java 平臺提供了大量的內(nèi)置的 Provider,它們實現(xiàn)了一套廣泛使用的基礎(chǔ)安全服務。然而,仍有一些應用需要的新興的標準或?qū)S蟹諞]有支持。Java 平臺支持安裝用戶自定義的此類服務的 Provider。

安全 Provider

在 Java 平臺,類java.security.Provider封裝了安全 Provider 的概念。它規(guī)定了 Provider 的名字,列出了它實現(xiàn)的安全服務。多個 Provider 可以同時配置,并列出優(yōu)先級。當請求安全服務時,高優(yōu)先級的 Provider 所實現(xiàn)的服務會被執(zhí)行。

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

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

程序可通過指定 Provider 的名字,來選擇請求執(zhí)行特定的 Provider,如下:

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

圖1和圖2說明了請求 SHA-256消息摘要執(zhí)行的這些選項。這兩張圖展示了三個 Provider 執(zhí)行消息摘要算法。Provider 按優(yōu)先級從左到右排列。圖1中,應用請求執(zhí)行 SHA-256算法而沒有指定 Provider 的名字,此時按優(yōu)先級搜索Provider,能提供指定算法的 第一個Provider 將會執(zhí)行,所以 ProviderB 將會返回。圖2中,應用請求執(zhí)行 SHA-256算法,并指定了Provider 即 ProviderC。此時,這個 Provider 的執(zhí)行將返回,即使更高優(yōu)先級的 ProviderB 也提供了 SHA-256的實現(xiàn)。


圖1 搜索Provider

圖2 請求特定的 Provider
Oracle 發(fā)布的Java平臺提供了大量預先配置好的缺省的 Provider,它們實現(xiàn)了一套應用所使用的基礎(chǔ)安全服務。需要注意的是,不同廠商的 Java 平臺發(fā)型版可能包含不同廠商特定的安全服務的封裝。本文所提到的內(nèi)置缺省 Provider,都是指 Oracle 發(fā)型版中可用的。

下面的小節(jié)涉及很多安全領(lǐng)域(密碼,認證等),每個都包含了缺省 Provider 所提供的相關(guān)服務的描述。附件 C 中的表 A 總結(jié)了所有的缺省的 Provider。

文件位置

本文提到的關(guān)于 Java 安全的一些內(nèi)容(包括配置 Provider)可以通過設(shè)置安全屬性來定制化。你可以靜態(tài)的在安全屬性文件中設(shè)置安全屬性,它缺省的是 java.security,在目錄 lib/security 中(在安裝 Java 運行環(huán)境 JRE 的路徑下)。安全屬性也可以動態(tài)設(shè)置,即調(diào)用適當類 Security 中的方法(在 java.security 包中)。

本文提到的工具及命令均在目錄jre/bin,此處jre 代表 JRE 的安裝目錄。第5節(jié)提到的cacert 文件在~jre/lib/security。

4、密碼學

Java 密碼學架構(gòu)是一套面向 Java 平臺的框架,提供訪問和開發(fā)密碼應用功能。它包括密碼應用服務所用的 API,如下:

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

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

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

Java 平臺為最通用的密碼算法提供了內(nèi)置的 Provider,包括 RSA、DSA、ECDSA 簽名算法,DES、AES、ARCFOUR 加密算法,MD5、SHA-1、SHA-256消息摘要算,Diffie-Hellman、ECDH 秘鑰協(xié)商算法。這些缺省的 Provider 均以 Java 代碼來實現(xiàn)密碼算法。

Java 平臺還提供了一個特殊的內(nèi)置 Provider,它充當與本地 PKCS#11(v2.x)令牌的橋梁。這個 Provider 的名字是 SunPKS11,它允許Java 應用無縫的訪問由兼容 PKCS#11的令牌所提供的密碼服務。

在Windows 上,Java 平臺也提供了一個內(nèi)置 Provider,用于橋接本地的微軟CryptoAPI。這個 Provider 的名字是 SunMSCAPI,它允許 Java 應用在 Windows 上,通過 CryptoAPI無縫的訪問密碼服務。

5、公鑰基礎(chǔ)設(shè)施

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

Java 平臺所包含的 API 和 Provider 支持 X.509 數(shù)字證書和證書吊銷列表(CRL),以及 兼容PKIX的證書目錄建立與驗證。與 PKI 相關(guān)的類位于 java.security和java.security.cert包。

秘鑰和證書存儲

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

KeyStore 和 CertStore 實現(xiàn)按類型區(qū)分。Java 平臺支持標準的 PKCS11和 PKCS12的秘鑰存儲類型,它們的實現(xiàn)兼容相應的 PKCS 規(guī)格(RSA 安全)。它還包括了一個基于專有文件的秘鑰存儲類型,JKS(Java Key Store)和 DKS(Domain Key Store),后者是一個秘鑰存儲集合,代表了一個獨立的邏輯秘鑰存儲。

Java 平臺提供了一個特殊的內(nèi)置 JKS 秘鑰存儲 cacerts,其包含了很多公認的可信的 CA 的證書。工具keytool可以列出 cacerts 中的證書(見第10節(jié)安全特性文檔鏈接)。

第4節(jié)提到的SunPKCS11 Provider 實現(xiàn)了 PKCS11 KeyStore。這意味著借助 KeyStore API Java 應用可以訪問屬于安全硬件(如智能卡)的秘鑰和證書。需要提醒的是,智能卡的秘鑰可能不允許離開設(shè)備。在這種情況下,KeyStore API 可能簡單返回 java.security.Key 對象應用,即只是秘鑰的引用,而不是包含實際秘鑰本身。這樣的Key 對象只能在設(shè)備上執(zhí)行加密運算,實際的秘鑰駐留在設(shè)備上。

Java 平臺還支持 LDAP 證書存儲類型(訪問存在 LDAP 目錄中的證書)和內(nèi)存Collection證書存儲類型(訪問由java.util.Collection對象管理的證書)。

PKI工具

有兩種內(nèi)置工具可配合秘鑰、證書、秘鑰存儲工作:
keytool 用于創(chuàng)建和管理秘鑰存儲,它支持:

  • 創(chuàng)建公鑰私鑰對
  • 顯示、導入、導出 X.509 v1,v2,v3 證書并存為文件
  • 創(chuàng)建自簽名證書
  • 發(fā)布可發(fā)送給 CA 的證書(PKCS#10)
  • 基于證書請求只做證書
  • 導入證書副本(從 CA 獲得)
  • 指定可信的公鑰證書
  • 接收口令并以秘鑰形式安全存儲

jarsinger 工具用于對 JAR 文件進行簽名,也可以驗證JAR 文件的簽名。Java ARchive(JAR)文件格式將多個文件打包成一個文件。典型的 JAR 文件包含類文件、applet和應用需要的附加的資源文件。當你需要數(shù)字簽名碼時,你手下要用 keytool 生成或?qū)雽拿罔€和證書到你的秘鑰存儲(如果它們之前不在那里),之后使用 jar 工具將碼放入到 JAR 文件中,最后使用 jarsigner 工具去簽名 JAR 文件。jarsigner 工具訪問秘鑰存儲,可以查找任意秘鑰和證書,以便于對 JAR 文件簽名或驗證其簽名的有效性。注意:jarsigner 可以選擇生成簽名并包含時間戳。驗證 JAR 文件簽名的系統(tǒng)(如 Java Plug-in)可以檢查時間戳,接受簽名曾經(jīng)有效的 JAR 文件,而不是要求證書現(xiàn)在有效。(證書通常每年都會過期,沒有理由期望 JAR 文件創(chuàng)建者每年重新簽名并部署 JAR 文件)。

6、認證

認證是檢測用戶身份的過程。在 Java 運行環(huán)境中,它是指確認執(zhí)行的 Java 程序的用戶。在一些特定的情況下,這個過程依賴于第4節(jié)所介紹的密碼服務。

Java 平臺提供 API 使應用可用借助可插拔的模塊顯示用戶認證。應用調(diào)用 LoginContext 類(在包 javax.security.auth.login),它將返回配置的引用。這個配置指定哪個登錄模塊(接口javax.security.auth.spi.LoginModule的一個實現(xiàn))會被用于執(zhí)行實際的認證。

由于應用是獨立訪問標準的 LoginContext 接口,所以他們保持與下層可插拔模塊的獨立性。新的或更新的模塊可以根據(jù)應用需要插入,而不必修改應用本身。圖3說明了應用與下層登錄模塊的的獨立性。


圖3 認證登錄模塊插入認證框架

有一點很重要,雖然登錄模塊是可插拔的組件,可以通過配置接入 Java 平臺,但他們并不是通過安全 Provider 接入的。因此,它們不遵循第3節(jié)所描述的 Provider 搜索模型(上圖),登錄模型由各自的唯一的配置來管理。

Java 平臺提供了以下內(nèi)置的登錄模塊,它們都在包 com.sun.security.auth.module中:

  • Krb5LoginModule 使用 Kerberos 協(xié)議認證
  • JndiLoginModule 使用 LDAP、NIS 數(shù)據(jù)庫進行用戶/密碼認證
  • KeyStoreLoginModule 登入任意類型的秘鑰存儲,包括 PKCS#11令牌秘鑰存儲

在兩個節(jié)點間建立安全通訊時,認證也可完成。Java 平臺提供了很多標準通訊協(xié)議的實現(xiàn),這將在下一節(jié)討論。

7、安全通訊

數(shù)據(jù)通過網(wǎng)絡(luò)傳輸,有可能被不是預期的接收者獲取。當這些數(shù)據(jù)包含私有信息(如密碼、信用卡號),必須采取措施讓未授權(quán)的其他方不能了解這些數(shù)據(jù)。同樣重要的是,確保在你發(fā)送數(shù)據(jù)給相應的接收者時,這些數(shù)據(jù)在傳輸過程中,不會被有意或無意的修改。

加密是安全通訊的基本要求,見第4節(jié)。針對很多標準的安全通訊協(xié)議,Java 平臺也提供了 API 支持和 Priovider 實現(xiàn)。

SSL/TLS

Java平臺提供了 SSL、TLS 協(xié)議的 API 及實現(xiàn),包括數(shù)據(jù)加密功能、消息完整性、服務器認證、可選的客戶端認證。應用可以使用 SSL/TLS來為通訊雙方提供安全的數(shù)據(jù)通道,可支持任意的應用協(xié)議,如 基于 TCP/IP 的HTTP。

類javax.net.ssl.SSLSocekt在常規(guī)流式套接字(java.net.Socket)上封裝了 SSL/TLS的支持。一些應用可能想使用交替的數(shù)據(jù)傳輸抽象(如 New-I/O),類 javax.net.ssl.SSLEngine 可用用來生產(chǎn)和消費 SSL/TLS 包。

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

Java 平臺提供的內(nèi)置 Provider 實現(xiàn) SSL/TLS協(xié)議:

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

SASL

簡單認證與安全層 Simple Authentication and Security Layer (SASL)是一個互聯(lián)網(wǎng)標準,它詳細規(guī)范了客戶端與服務應用間的認證和可選的安全層的建立。SASL 定義了如何交互認證數(shù)據(jù),并沒有限定數(shù)據(jù)內(nèi)容。它是一套規(guī)范認證機制的框架,這些機制規(guī)定了內(nèi)容及認證數(shù)據(jù)可以支持的語義。標準 SASL 機制眾多,它們由互聯(lián)網(wǎng)社區(qū)根據(jù)不同的安全級別和部署場景而制定。

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

SASL 機制在 Provider 包中實現(xiàn)。每個 Provider 可以支持一個或多個 SASL 機制,每個 Provider 可以通過標準的 Provider 架構(gòu)來注冊和觸發(fā)。

Java 平臺提供了支持以下 SASL 機制的內(nèi)置 Provider。

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

GSS-API 與 Kerberos

Java平臺提供了API 以便于 Java 語言方便訪問通用安全服務應用開發(fā)接口(GSS-API)。GSS-API 提供給應用開發(fā)人員統(tǒng)一的方法訪問基于安全機制構(gòu)建的安全服務。Java GSS-API 目前需要使用 Keberos v5 機制,Java 平臺提供了該機制的內(nèi)置實現(xiàn)。現(xiàn)在,還不能插入附加的機制。注意:第6節(jié)提到的Krb5LoginModule與 GSS Kerberos 機制一起使用。

Java 平臺內(nèi)置實現(xiàn)了 Simple and Protected GSSAPI Negotiation Mechanism(SPNEGO) GSS-API 機制。

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

Java GSS API 位于org.ietf.jgss包中。Java 平臺還定義了基礎(chǔ)的 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中)來設(shè)定,或者 java 觸發(fā)時在命令行中增加參數(shù) -Djava.security.manager。

許可

類加載器將 Java 代碼加載Java 運行時,同時會自動將此代碼與以下信息建立關(guān)聯(lián):

  • 代碼從哪里加載的
  • 誰簽名該代碼(如果有)
  • 該代碼的缺省許可

無論代碼是從不可信網(wǎng)絡(luò)下載的(如 applet)還是從文件系統(tǒng)加載(如本地應用),這些信息都會與代碼關(guān)聯(lián)起來。代碼被加載的路徑用 URL 表示,代碼簽名用簽名者證書鏈表示,缺省許可用java.security.Permission 對象來表示。

下載的代碼的缺省許可會自動的增加訪問其下載源的網(wǎng)絡(luò)連接權(quán)限。從本地文件加載的代碼的缺省許可會自動賦予讀取器所在路徑其他文件的能力,也包括子文件夾。

注意:在類加載階段,不能確認執(zhí)行代碼的用戶身份。如果需要,應用代碼要自己認證最終用戶(如見第6節(jié))。一旦用戶通過認證,應用會通過調(diào)用 doAS 方法(java.security.auth.Subject類)將執(zhí)行代碼的用戶與其關(guān)聯(lián)。

策略

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

Java 平臺將安全策略的概念封裝在類java.security.Policy中。在任何時間,它都是java 運行時中唯一的 Policy 對象。Policy 對象基本的職責是,檢測是否允許代碼訪問受保護的資源(這由其被加載的位置、誰簽名及誰執(zhí)行決定)。Policy 對象如何做決定是與實現(xiàn)無關(guān)的。例如,它可以查詢包括授權(quán)代碼的數(shù)據(jù)庫,也可以聯(lián)系另一個服務。

Java 平臺的缺省 Policy 實現(xiàn)是從一個或多個 ASCII(UTF-8)文件中讀取認證數(shù)據(jù),這些文件是配置在安全屬性文件中的。這些策略文件包括賦予代碼的精確許可集合:特別的是,當代碼從特別的位置加載,由特別的實體簽名,由特別的用戶執(zhí)行,都會賦予準確的許可集合。每個文件中的策略實體必須遵循成文的專用語法,也可以使用純文本便器或者圖形化工具 policytool 來編寫。

訪問控制增強

Java 運行時跟蹤程序執(zhí)行產(chǎn)生的 Java 調(diào)用序列。當訪問受保護資源時,缺省的整個調(diào)用棧會被評估是否允許該訪問申請。
如之前提到的,資源由 SecurityManager 來保護。以下是Java 平臺和應用的安全敏感代碼保護訪問資源的代碼示例:
SecurityManager sm = System.getSecurityManager(); if ( sm != null ) { sm.checkPermission( perm); }
perm 是對應訪問請求的許可對象。例如,如果嘗試讀取文件/temp/abc,許可可能如下構(gòu)造:
Permission perm = new java.io.FilePermission( “/tmp/abc”, “read" );
缺省的 SecurityManager 實現(xiàn)授權(quán)java.security.AccessController 實現(xiàn)來完成決定。AccessController遍歷調(diào)用棧,將安裝的安全 Policy 和訪問的許可,傳遞給棧中的每個代碼元素(如,上面例子中的 FilePermission)。Policy 根據(jù)管理員配置的許可決定請求的訪問是否被授權(quán)。如果訪問沒有被授權(quán),AccessController 會拋出java.lang.SecurityExcepion。

圖4 展示了訪問控制增強。在這個具體的例子中,在調(diào)用堆棧中有兩個初始元素,ClassA 和 ClassB。ClassA調(diào)用ClassB 的方法,該方法創(chuàng)建java.io.FileInputStream 的實例,嘗試訪問文件/tmp/abc。

FileInputStream 構(gòu)造器創(chuàng)建了上面的 FilePermission,perm,然后將 perm 傳給 SecurityManager的 checkPermission方法。在這個具體的示例中,只需要檢查ClassA 和 ClassB的許可,這是因為所有系統(tǒng)代碼,包括 FileInputStream、SecurityManager和 AccessController,會自動獲得所有許可。

在這個例子中,ClassA 和 ClassB 代碼特征不同,他們來自不同的位置和不同的簽名者。每個都被賦予不同的許可集合。如果 Policy 指出兩個類都被賦予需要 FilePermission,AccessController 只會授權(quán)訪問需要的文件。

圖4 控制對資源的訪問

9、XML 簽名

Java XML 數(shù)字簽名 API 是用于生成和驗證 XML 簽名的標準 Java API。

XML 簽名可以用于任意數(shù)據(jù)類型,包括 XML 和二進制(見* http://www.w3.org/TR/xmldsig-core/ *)。簽名的結(jié)果也是 XML 形式的。XML 簽名可用于保證數(shù)據(jù)安全,提供數(shù)據(jù)完整性保護、消息認證、簽名認證。

該API 設(shè)計支持 W3C 關(guān)于 XML 簽名語法及處理的推薦中所有必須的和推薦的特性。這套 API 也可擴展和可插拔的,是基于 Java 密碼服務 Provider 框架。

Java XML數(shù)字簽名 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 相關(guān)的服務(第7節(jié)),JCE(Java 加密擴展)指加密服務(第4節(jié)),JAAS(Java Authentication and Authorization Service)指認證和基于用戶的訪問控制服務(第6、8節(jié))。

附 A、 類匯總

表1 總結(jié)了本文提到的安全類和接口的名稱、包和用途。
表1 關(guān)鍵 Java 安全包和類

Package Class/Interface Name Usage
com.sun.security.auth.module JndiLoginModule Performs username/password authentication using LDAP or NIS
com.sun.security.auth.module KeyStoreLoginModule Performs authentication based on key store login
com.sun.security.auth.module Krb5LoginModule Performs authentication using Kerberos protocols
java.lang SecurityException Indicates a security violation
java.lang SecurityManager Mediates all access control decisions
java.lang System Installs the SecurityManager
java.security AccessController Called by default implementation of SecurityManager to make access control decisions
java.security DomainLoadStoreParameter Stores parameters for the Domain keystore (DKS)
java.security Key Represents a cryptographic key
java.security KeyStore Represents a repository of keys and trusted certificates
java.security MessageDigest Represents a message digest
java.security Permission Represents access to a particular resource
java.security PKCS12Attribute Supports attributes in PKCS12 keystores
java.security Policy Encapsulates the security policy
java.security Provider Encapsulates security service implementations
java.security Security Manages security providers and security properties
java.security Signature Creates and verifies digital signatures
java.security.cert Certificate Represents a public key certificate
java.security.cert CertStore Represents a repository of unrelated and typically untrusted certificates
java.security.cert CRL Represents a CRL
javax.crypto Cipher Performs encryption and decryption
javax.crypto KeyAgreement Performs a key exchange
javax.net.ssl KeyManager Manages keys used to perform SSL/TLS authentication
javax.net.ssl SSLEngine Produces/consumes SSL/TLS packets, allowing the application freedom to choose a transport mechanism
javax.net.ssl SSLSocket Represents a network socket that encapsulates SSL/TLS support on top of a normal stream socket
javax.net.ssl 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
javax.security.auth.kerberos KerberosTicket Represents a Kerberos ticket
javax.security.auth.kerberos KerberosKey Represents a Kerberos key
javax.security.auth.kerberos 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
javax.security.sasl SaslClient Performs SASL authentication as a client
javax.security.sasl 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 Usage
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 系統(tǒng)的 Java 平臺的 Kerberos 相關(guān)工具。相應功能的同名工具也是 Solaris 和 Linux 操作環(huán)境的組成部分。表3匯總了 Kerberos 工具。

Tool Usage
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、內(nèi)置 Provider

Oracle 版Java 平臺提供大量的內(nèi)置的 Provider 包。更多細節(jié),見Java Cryptography Architecture Oracle Provider Documentation。

原文:Java Security Overview

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,991評論 19 139
  • 自動化檢測360顯微鏡(完全免費) http://appscan.360.cn/阿里聚安全(部分收費)https:...
    極客圈閱讀 8,746評論 0 18
  • 過程中:忘記時間,全身心投入 結(jié)束后:回味無窮,充滿成就感 隨感小記。好像又有一點點進步
    Birt的日記閱讀 359評論 2 1
  • 戀愛是甜蜜的 戀愛是浪漫的 可是談了很久了 為何對方還不想結(jié)婚? 有時候,一方覺得合適結(jié)婚了,而另外一方始終無動于...
    45742a27dffe閱讀 307評論 0 0
  • 那天 得到APP例會上,創(chuàng)始人羅振宇在說他對“清單”的新認知,以及得到下一步針對這種文章體例的戰(zhàn)略部署。這種敢...
    Ade_nina閱讀 496評論 0 0