Java密码体系结构简介:Java Cryptography Architecture (JCA) Reference Guide
來(lái)自Java官方的文檔,作備忘使用。
簡(jiǎn)介:
Java平臺(tái)非常強(qiáng)調(diào)安全性,包括語(yǔ)言安全,密碼學(xué),公鑰基礎(chǔ)設(shè)施,認(rèn)證,安全通信和訪(fǎng)問(wèn)控制。
JCA是平臺(tái)的一個(gè)主要部分,包含一個(gè)“提供者”體系結(jié)構(gòu)和一組用于數(shù)字簽名,消息摘要(哈希),證書(shū)和證書(shū)驗(yàn)證,加密(對(duì)稱(chēng)/非對(duì)稱(chēng)塊/流密碼),密鑰生成管理和安全隨機(jī)數(shù)生成等等。這些API允許開(kāi)發(fā)人員將安全性輕松集成到應(yīng)用程序代碼中。這個(gè)架構(gòu)是圍繞以下原則設(shè)計(jì)的:
實(shí)現(xiàn)獨(dú)立性:應(yīng)用程序不需要實(shí)現(xiàn)安全算法。相反,他們可以從Java平臺(tái)請(qǐng)求安全服務(wù)。安全服務(wù)在提供者(見(jiàn)下文)中實(shí)現(xiàn),通過(guò)標(biāo)準(zhǔn)接口插入Java平臺(tái)。應(yīng)用程序可能依靠多個(gè)獨(dú)立的提供者來(lái)提供安全功能。
實(shí)現(xiàn)互操作性:提供者可以跨應(yīng)用程序進(jìn)行互操作。具體而言,應(yīng)用程序不綁定到特定的提供者,而提供者也不綁定到特定的應(yīng)用程序。
算法可擴(kuò)展性:Java平臺(tái)包括許多內(nèi)置的提供者,這些提供者實(shí)現(xiàn)了當(dāng)今廣泛使用的一組基本的安全服務(wù)。但是,一些應(yīng)用程序可能依賴(lài)尚未實(shí)施的新興標(biāo)準(zhǔn)或?qū)S蟹?wù)。 Java平臺(tái)支持安裝實(shí)現(xiàn)這些服務(wù)的定制提供程序。
JDK中提供的其他密碼通信庫(kù)使用JCA提供程序體系結(jié)構(gòu),但在別處進(jìn)行了介紹。?Java Secure Socket Extension (JSSE) Java安全套接字?jǐn)U展(JSSE)提供對(duì)?Secure Socket Layer(SSL)和?Transport Layer Security(TLS)實(shí)現(xiàn)的訪(fǎng)問(wèn)。 Java通用安全服務(wù)(JGSS)(通過(guò)Kerberos)API以及簡(jiǎn)單身份驗(yàn)證和安全層(SASL)也可用于在通信應(yīng)用程序之間安全地交換消息。
術(shù)語(yǔ)注釋:
在JDK 1.4之前,JCE是一個(gè)非捆綁產(chǎn)品,因此,JCA和JCE被定期稱(chēng)為獨(dú)立的,獨(dú)特的組件。由于JCE現(xiàn)在捆綁在JDK中,所以區(qū)別變得不那么明顯了。由于JCE使用與JCA相同的體系結(jié)構(gòu),所以JCE應(yīng)該更適合作為JCA的一部分。
JDK中的JCA包含兩個(gè)軟件組件:
1.?定義和支持提供者為其提供實(shí)現(xiàn)的加密服務(wù)的框架。這個(gè)框架包含了諸如java.security,javax.crypto,javax.crypto.spec和javax.crypto.interfaces等軟件包。
2.Sun,SunRsaSign,SunJCE等實(shí)際提供者都包含了具體的加密實(shí)現(xiàn)。
無(wú)論什么時(shí)候提及特定的JCA提供者,都可以找到與之對(duì)應(yīng)的名稱(chēng)。
警告:JCA可以輕松地將安全功能集成到您的應(yīng)用程序中。然而,除了基本介紹討論API所需的概念之外,本文檔不包括安全/密碼學(xué)理論。本文檔也沒(méi)有涵蓋特定算法的優(yōu)缺點(diǎn),也不涵蓋協(xié)議設(shè)計(jì)。密碼學(xué)是一個(gè)高級(jí)課題,為了最好地利用這些工具,應(yīng)該參考一個(gè)可靠的,最近的參考文獻(xiàn)。 你應(yīng)該總是明白你在做什么,為什么,而不是簡(jiǎn)單地復(fù)制隨機(jī)代碼,并期望它完全解決你的使用場(chǎng)景。不然就會(huì)出現(xiàn),由于選擇了錯(cuò)誤的工具或算法,而部署了許多包含重大安全或性能問(wèn)題的應(yīng)用程序。
?
設(shè)計(jì)原則:
JCA是圍繞這些原則設(shè)計(jì)的:
1.實(shí)現(xiàn)獨(dú)立性和互操作性
2.算法獨(dú)立性和可擴(kuò)展性
實(shí)現(xiàn)獨(dú)立性和算法獨(dú)立性是互補(bǔ)的;您可以使用加密服務(wù)(如數(shù)字簽名和消息摘要),而無(wú)需擔(dān)心實(shí)現(xiàn)細(xì)節(jié),甚至是構(gòu)成這些概念基礎(chǔ)的算法。盡管完全的算法獨(dú)立性是不可能的,但JCA提供了標(biāo)準(zhǔn)化的,算法特定的API。當(dāng)實(shí)現(xiàn)獨(dú)立性不可取時(shí),JCA讓開(kāi)發(fā)人員指出具體的實(shí)現(xiàn)。
通過(guò)定義密碼“引擎”(服務(wù))的類(lèi)型,并定義提供這些密碼引擎的功能的類(lèi)來(lái)實(shí)現(xiàn)算法獨(dú)立性。這些類(lèi)被稱(chēng)為引擎類(lèi),例如MessageDigest,Signature,KeyFactory,KeyPairGenerator和Cipher類(lèi)。
實(shí)現(xiàn)獨(dú)立性是使用基于“提供者”的體系結(jié)構(gòu)實(shí)現(xiàn)的。術(shù)語(yǔ)密碼服務(wù)提供商(CSP)(在本文檔中與“提供商”可互換使用)是指實(shí)現(xiàn)一個(gè)或多個(gè)密碼服務(wù)(如數(shù)字簽名算法,消息摘要算法和密鑰轉(zhuǎn)換服務(wù))的包或一組包。程序可以簡(jiǎn)單地請(qǐng)求實(shí)現(xiàn)特定服務(wù)(例如DSA簽名算法)的特定類(lèi)型的對(duì)象(例如簽名對(duì)象),并從一個(gè)安裝的提供者獲得實(shí)現(xiàn)。如果需要的話(huà),程序可以改為請(qǐng)求來(lái)自特定提供者的實(shí)現(xiàn)。提供商可能會(huì)更新透明的應(yīng)用程序,例如,當(dāng)更快或更安全的版本可用。
實(shí)現(xiàn)互操作性意味著各種實(shí)現(xiàn)可以相互協(xié)作,使用彼此的密鑰,或者驗(yàn)證彼此的簽名。這就意味著,例如,對(duì)于相同的算法,由一個(gè)提供者生成的密鑰可以被另一個(gè)提供者使用,并且由一個(gè)提供者生成的簽名可以被另一個(gè)提供者驗(yàn)證。
算法可擴(kuò)展性意味著可以容易地添加適合于所支持的引擎類(lèi)之一的新算法。
?
加密服務(wù)提供者:
java.security.Provider是所有安全提供程序的基類(lèi)。每個(gè)CSP都包含這個(gè)類(lèi)的一個(gè)實(shí)例,它包含了提供者的名字,并列出了它實(shí)現(xiàn)的所有安全服務(wù)/算法。當(dāng)需要特定算法的實(shí)例時(shí),JCA框架會(huì)咨詢(xún)提供者的數(shù)據(jù)庫(kù),如果找到合適的匹配項(xiàng),則創(chuàng)建該實(shí)例。
提供者包含一個(gè)包(或一組包),為廣告的加密算法提供具體的實(shí)現(xiàn)。每個(gè)JDK安裝都默認(rèn)安裝并配置了一個(gè)或多個(gè)提供程序。其他提供者可以靜態(tài)或動(dòng)態(tài)添加(參見(jiàn)提供者和安全類(lèi))。客戶(hù)端可以配置其運(yùn)行時(shí)環(huán)境來(lái)指定提供程序的首選順序。首選順序是在沒(méi)有請(qǐng)求特定提供者時(shí)提供者搜索請(qǐng)求的服務(wù)的順序。
要使用JCA,應(yīng)用程序只需要請(qǐng)求特定類(lèi)型的對(duì)象(如MessageDigest)和特定的算法或服務(wù)(如“SHA-256”算法),并從一個(gè)已安裝的提供者獲取實(shí)現(xiàn)。或者,程序可以請(qǐng)求來(lái)自特定提供者的對(duì)象。每個(gè)提供者都有一個(gè)名字來(lái)引用它。
md = MessageDigest.getInstance("SHA-256"); md = MessageDigest.getInstance("SHA-256", "ProviderC");?下圖說(shuō)明了請(qǐng)求“SHA-256”消息摘要實(shí)現(xiàn)。這些圖顯示了實(shí)現(xiàn)各種消息摘要算法(“SHA-256”,“SHA-384”和“SHA-512”)的三個(gè)不同的提供者。提供者按照優(yōu)先順序從左至右排列(1-3)。在第一個(gè)例子中,一個(gè)應(yīng)用程序請(qǐng)求一個(gè)SHA-256算法實(shí)現(xiàn)而不指定提供者名稱(chēng)。提供程序按優(yōu)先順序搜索,并返回提供該特定算法ProviderB的第一個(gè)提供程序的實(shí)現(xiàn)。在第二個(gè)圖中,應(yīng)用程序請(qǐng)求來(lái)自特定提供者ProviderC的SHA-256算法實(shí)現(xiàn)。這次ProviderC的實(shí)現(xiàn)被返回,即使具有更高優(yōu)先級(jí)的提供者ProviderB也提供SHA-256實(shí)現(xiàn)。
JDK中的加密實(shí)現(xiàn)主要是出于歷史原因通過(guò)幾個(gè)不同的提供者(Sun,SunJSSE,SunJCE,SunRsaSign)分發(fā)的,但在較小的程度上由它們提供的功能和算法的類(lèi)型來(lái)分發(fā)。其他Java運(yùn)行時(shí)環(huán)境可能不一定包含這些Sun提供程序,因此除非知道特定的提供程序可用,否則應(yīng)用程序不應(yīng)請(qǐng)求提供程序特定的實(shí)現(xiàn)。
JCA提供了一組API,允許用戶(hù)查詢(xún)安裝哪些提供程序以及支持哪些服務(wù)。
提供者如何實(shí)際執(zhí)行:
如前所述,通過(guò)定義所有應(yīng)用程序用于訪(fǎng)問(wèn)服務(wù)類(lèi)型的通用高級(jí)應(yīng)用程序編程接口(API)來(lái)實(shí)現(xiàn)算法獨(dú)立性。實(shí)現(xiàn)獨(dú)立性是通過(guò)使所有提供者實(shí)現(xiàn)符合定義良好的接口來(lái)實(shí)現(xiàn)的。引擎類(lèi)的實(shí)例因此被具有相同方法簽名的實(shí)現(xiàn)類(lèi)“支持”。應(yīng)用程序調(diào)用通過(guò)引擎類(lèi)路由,并傳遞到底層的后臺(tái)實(shí)現(xiàn)。該實(shí)現(xiàn)處理請(qǐng)求并返回正確的結(jié)果。
每個(gè)引擎類(lèi)中的應(yīng)用程序API方法通過(guò)實(shí)現(xiàn)相應(yīng)Service Provider Interface(SPI)的類(lèi)路由到提供程序的實(shí)現(xiàn)。也就是說(shuō),對(duì)于每個(gè)引擎類(lèi),都有一個(gè)相應(yīng)的抽象SPI類(lèi),它定義了每個(gè)加密服務(wù)提供者算法必須實(shí)現(xiàn)的方法。每個(gè)SPI類(lèi)的名稱(chēng)與相應(yīng)的引擎類(lèi)相同,接著是Spi。例如,簽名引擎類(lèi)提供對(duì)數(shù)字簽名算法的功能的訪(fǎng)問(wèn)。實(shí)際的提供者實(shí)現(xiàn)是在SignatureSpi的子類(lèi)中提供的。應(yīng)用程序調(diào)用引擎類(lèi)的API方法,在實(shí)際的實(shí)現(xiàn)中又調(diào)用SPI方法。
每個(gè)SPI類(lèi)都是抽象的。為了為特定算法提供特定類(lèi)型的服務(wù),提供者必須繼承相應(yīng)的SPI類(lèi),并提供所有抽象方法的實(shí)現(xiàn)。
對(duì)于API中的每個(gè)引擎類(lèi),通過(guò)調(diào)用引擎類(lèi)中的getInstance()工廠方法來(lái)請(qǐng)求和實(shí)例化實(shí)現(xiàn)實(shí)例。工廠方法是一個(gè)返回一個(gè)類(lèi)的實(shí)例的靜態(tài)方法。引擎類(lèi)使用上述框架提供者選擇機(jī)制來(lái)獲取實(shí)際的后臺(tái)實(shí)現(xiàn)(SPI),然后創(chuàng)建實(shí)際的引擎對(duì)象。引擎類(lèi)的每個(gè)實(shí)例都封裝(作為專(zhuān)用字段)相應(yīng)SPI類(lèi)的實(shí)例,稱(chēng)為SPI對(duì)象。 API對(duì)象的所有API方法都聲明為final,并且它們的實(shí)現(xiàn)調(diào)用封裝SPI對(duì)象的相應(yīng)SPI方法。 為了使這個(gè)更清楚,請(qǐng)查看下面的代碼和插圖: import javax.crypto.*;Cipher c = Cipher.getInstance("AES"); c.init(ENCRYPT_MODE, key);?
?
?
這里的應(yīng)用程序需要一個(gè)“AES”javax.crypto.Cipher實(shí)例,并不關(guān)心使用哪個(gè)提供程序。應(yīng)用程序調(diào)用Cipher引擎類(lèi)的getInstance()工廠方法,然后請(qǐng)求JCA框架查找支持“AES”的第一個(gè)提供程序?qū)嵗T摽蚣軙?huì)咨詢(xún)每個(gè)已安裝的提供者,并獲取提供者類(lèi)的提供者實(shí)例。 (回想一下Provider類(lèi)是可用算法的數(shù)據(jù)庫(kù)。)框架搜索每個(gè)提供者,最后在CSP3中找到合適的條目。這個(gè)數(shù)據(jù)庫(kù)入口指向擴(kuò)展CipherSpi的實(shí)現(xiàn)類(lèi)com.foo.AESCipher,因此適用于Cipher引擎類(lèi)。創(chuàng)建一個(gè)com.foo.AESCipher的實(shí)例,并將其封裝在一個(gè)新創(chuàng)建的javax.crypto.Cipher實(shí)例中,該實(shí)例返回給應(yīng)用程序。當(dāng)應(yīng)用程序現(xiàn)在對(duì)Cipher實(shí)例執(zhí)行init()操作時(shí),Cipher引擎類(lèi)將請(qǐng)求路由到com.foo.AESCipher類(lèi)中相應(yīng)的engineInit()支持方法。 密鑰管理 “密鑰庫(kù)”數(shù)據(jù)庫(kù)可用于管理密鑰和證書(shū)的存儲(chǔ)庫(kù)。密鑰庫(kù)可用于需要用于身份驗(yàn)證,加密或簽名的數(shù)據(jù)的應(yīng)用程序。 應(yīng)用程序可以通過(guò)java.security包中的KeyStore類(lèi)的實(shí)現(xiàn)來(lái)訪(fǎng)問(wèn)密鑰庫(kù)。建議的密鑰庫(kù)類(lèi)型(格式)是“pkcs12”,它基于RSA PKCS12個(gè)人信息交換語(yǔ)法標(biāo)準(zhǔn)。默認(rèn)的密鑰庫(kù)類(lèi)型是“jks”,這是一種專(zhuān)有格式。其他密鑰庫(kù)格式也是可用的,例如作為替代專(zhuān)有密鑰庫(kù)格式的“jceks”,以及基于RSA PKCS11標(biāo)準(zhǔn)的“pkcs11”,并且支持對(duì)硬件安全模塊和智能卡等加密令牌的訪(fǎng)問(wèn)。 應(yīng)用程序可以通過(guò)java.security包中的KeyStore類(lèi)的實(shí)現(xiàn)來(lái)訪(fǎng)問(wèn)密鑰庫(kù)。 Sun Microsystems提供了一個(gè)默認(rèn)的KeyStore實(shí)現(xiàn)。它使用名為“jks”的專(zhuān)有密鑰庫(kù)類(lèi)型(格式)將密鑰庫(kù)作為文件實(shí)現(xiàn)。其他密鑰庫(kù)格式也是可用的,比如“jceks”,它是一種比“jks”更加強(qiáng)大的加密的專(zhuān)有密鑰庫(kù)格式,以及基于RSA PKCS12個(gè)人信息交換語(yǔ)法標(biāo)準(zhǔn)的“pkcs12”。 應(yīng)用程序可以使用上述相同的提供程序機(jī)制,從不同的提供程序中選擇不同的密鑰庫(kù)實(shí)現(xiàn)。 JCA概念 本節(jié)介紹主要的JCA API 引擎類(lèi)和算法 引擎類(lèi)為特定類(lèi)型的密碼服務(wù)提供接口,而不依賴(lài)于特定的密碼算法或提供者。引擎要么提供: *?密碼操作(加密,數(shù)字簽名,消息摘要等), * 生成器或密碼材料的轉(zhuǎn)換器(密鑰和算法參數(shù)),或 *?對(duì)象(密鑰庫(kù)或證書(shū))封裝了密碼數(shù)據(jù),可以在更高的抽象層使用。 以下引擎類(lèi)別可用: *SecureRandom:用于生成隨機(jī)或偽隨機(jī)數(shù)字。 *MessageDigest:用于計(jì)算指定數(shù)據(jù)的消息摘要(散列)。 *Signature:使用密鑰初始化,這些簽名用于簽署數(shù)據(jù)并驗(yàn)證數(shù)字簽名。 *Cipher:用密鑰初始化,用于加密/解密數(shù)據(jù)。存在各種類(lèi)型的算法:對(duì)稱(chēng)批量加密(例如AES),非對(duì)稱(chēng)加密(例如RSA)和基于密碼的加密(例如PBE)。 *Message Authentication Codes (MAC):與MessageDigests一樣,它們也會(huì)生成散列值,但是首先使用密鑰初始化以保護(hù)消息的完整性。 *KeyFactory:用于將Key類(lèi)型的現(xiàn)有不透明密鑰轉(zhuǎn)換為密鑰規(guī)范(底層密鑰材料的透明表示),反之亦然。 *SecretKeyFactory:用于將SecretKey類(lèi)型的現(xiàn)有不透明加密密鑰轉(zhuǎn)換為密鑰規(guī)范(底層密鑰材料的透明表示),反之亦然。 SecretKeyFactorys是特殊的只能創(chuàng)建密鑰(對(duì)稱(chēng))的KeyFactorys。 *KeyPairGenerator:用于生成一對(duì)適用于指定算法的公鑰和私鑰。 *KeyGenerator:用于生成與指定算法一起使用的新密鑰。 *KeyAgreement:由兩方或多方使用,商定和建立一個(gè)特定的密鑰,用于特定的密碼操作。 *AlgorithmParameters:用于存儲(chǔ)特定算法的參數(shù),包括參數(shù)編碼和解碼。 *AlgorithmParameterGenerator:用于生成適合于指定算法的一組AlgorithmParameters。 *KeyStore:用于創(chuàng)建和管理密鑰庫(kù)。密鑰庫(kù)是密鑰的數(shù)據(jù)庫(kù)。密鑰庫(kù)中的私鑰具有與其關(guān)聯(lián)的證書(shū)鏈,用于驗(yàn)證相應(yīng)的公鑰。密鑰庫(kù)還包含來(lái)自可信實(shí)體的證書(shū)。 *CertificateFactory:用于創(chuàng)建公鑰證書(shū)和證書(shū)吊銷(xiāo)列表(CRL)。 *CertPathBuilder:用于構(gòu)建證書(shū)鏈(也稱(chēng)為證書(shū)路徑)。 *CertPathValidator:用于驗(yàn)證證書(shū)鏈。 *CertStore:用于從存儲(chǔ)庫(kù)中檢索證書(shū)和CRL。 注意:生成器創(chuàng)建具有全新內(nèi)容的對(duì)象,而工廠從現(xiàn)有元素(例如編碼)創(chuàng)建對(duì)象。 核心類(lèi)和接口 本節(jié)討論JCA中提供的核心類(lèi)和接口: *the Provider and Security classes, *the?SecureRandom,?MessageDigest,?Signature,?Cipher,?Mac,?KeyFactory,?SecretKeyFactory,?KeyPairGenerator,?KeyGenerator,?KeyAgreement,?AlgorithmParameters,?AlgorithmParameterGenerator?,?KeyStore, and?CertificateFactory, engine classes, ?*the?Key?interfaces and classes, *the?Algorithm Parameter Specification Interfaces and Classes?and the?Key Specification Interfaces and Classes, and?miscellaneous support and convenience interfaces and classes. 本部分顯示每個(gè)類(lèi)和接口中主要方法的簽名。其中一些類(lèi)(MessageDigest,Signature,KeyPairGenerator,SecureRandom,KeyFactory和關(guān)鍵規(guī)范類(lèi))的示例在相應(yīng)的示例部分中提供。 相關(guān)安全API軟件包的完整參考文檔可以在軟件包摘要中找到 java.security javax.crypto java.security.cert java.security.spec javax.crypto.spec java.security.interfaces javax.crypto.interfacesThe?Provider?Class
術(shù)語(yǔ)“加密服務(wù)提供者”(在本文檔中與“提供者”可互換使用)是指提供JDK安全API加密特征子集的具體實(shí)現(xiàn)的一個(gè)或一組包。 Provider類(lèi)是這種包或一組包的接口。它具有訪(fǎng)問(wèn)提供程序名稱(chēng),版本號(hào)和其他信息的方法。請(qǐng)注意,除了注冊(cè)加密服務(wù)的實(shí)現(xiàn)之外,Provider類(lèi)還可以用于注冊(cè)可能被定義為JDK安全API或其擴(kuò)展之一的其他安全服務(wù)的實(shí)現(xiàn)。
為了提供加密服務(wù)的實(shí)現(xiàn),實(shí)體(例如開(kāi)發(fā)組)編寫(xiě)實(shí)現(xiàn)代碼并創(chuàng)建提供者類(lèi)的子類(lèi)。 Provider子類(lèi)的構(gòu)造函數(shù)設(shè)置各種屬性的值; JDK安全API使用這些值來(lái)查找提供者實(shí)現(xiàn)的服務(wù)。換句話(huà)說(shuō),子類(lèi)指定實(shí)現(xiàn)服務(wù)的類(lèi)的名稱(chēng)。
?
?
不同的實(shí)現(xiàn)可能具有不同的特性。有些可能是基于軟件的,有些可能是基于硬件的。有些可能是平臺(tái)無(wú)關(guān)的,有些可能是平臺(tái)特定的。一些供應(yīng)商的源代碼可能可用于審查和評(píng)估,而有些則可能不可用。 JCA讓最終用戶(hù)和開(kāi)發(fā)者決定他們的需求。
在本節(jié)中,我們解釋最終用戶(hù)如何安裝符合他們需求的加密實(shí)現(xiàn),以及開(kāi)發(fā)人員如何請(qǐng)求適合他們的實(shí)現(xiàn)。
詳細(xì)參見(jiàn):https://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/CryptoSpec.html
?
?
?
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Java密码体系结构简介:Java Cryptography Architecture (JCA) Reference Guide的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 条件队列大法好:wait和notify的
- 下一篇: goland 交叉生成linux文件