Java密碼體系結構簡介:Java Cryptography Architecture (JCA) Reference Guide

來自Java官方的文檔,做備忘使用。html

簡介:java

Java平臺很是強調安全性,包括語言安全,密碼學,公鑰基礎設施,認證,安全通訊和訪問控制。算法

JCA是平臺的一個主要部分,包含一個「提供者」體系結構和一組用於數字簽名,消息摘要(哈希),證書和證書驗證,加密(對稱/非對稱塊/流密碼),密鑰生成管理和安全隨機數生成等等。這些API容許開發人員將安全性輕鬆集成到應用程序代碼中。這個架構是圍繞如下原則設計的:數據庫

  實現獨立性:應用程序不須要實現安全算法。相反,他們能夠從Java平臺請求安全服務。安全服務在提供者(見下文)中實現,經過標準接口插入Java平臺。應用程序可能依靠多個獨立的提供者來提供安全功能。編程

  實現互操做性:提供者能夠跨應用程序進行互操做。具體而言,應用程序不綁定到特定的提供者,而提供者也不綁定到特定的應用程序。安全

  算法可擴展性:Java平臺包括許多內置的提供者,這些提供者實現了當今普遍使用的一組基本的安全服務。可是,一些應用程序可能依賴還沒有實施的新興標準或專有服務。 Java平臺支持安裝實現這些服務的定製提供程序。架構

JDK中提供的其餘密碼通訊庫使用JCA提供程序體系結構,但在別處進行了介紹。 Java Secure Socket Extension (JSSE) Java安全套接字擴展(JSSE)提供對 Secure Socket Layer(SSL)和 Transport Layer Security(TLS)實現的訪問。 Java通用安全服務(JGSS)(經過Kerberos)API以及簡單身份驗證和安全層(SASL)也可用於在通訊應用程序之間安全地交換消息。oracle

術語註釋:框架

在JDK 1.4以前,JCE是一個非捆綁產品,所以,JCA和JCE被按期稱爲獨立的,獨特的組件。因爲JCE如今捆綁在JDK中,因此區別變得不那麼明顯了。因爲JCE使用與JCA相同的體系結構,因此JCE應該更適合做爲JCA的一部分。dom

JDK中的JCA包含兩個軟件組件:

1. 定義和支持提供者爲其提供實現的加密服務的框架。這個框架包含了諸如java.security,javax.crypto,javax.crypto.spec和javax.crypto.interfaces等軟件包。

2.Sun,SunRsaSign,SunJCE等實際提供者都包含了具體的加密實現。

不管何時說起特定的JCA提供者,均可以找到與之對應的名稱。


警告:JCA能夠輕鬆地將安全功能集成到您的應用程序中。然而,除了基本介紹討論API所需的概念以外,本文檔不包括安全/密碼學理論。本文檔也沒有涵蓋特定算法的優缺點,也不涵蓋協議設計。密碼學是一個高級課題,爲了最好地利用這些工具,應該參考一個可靠的,最近的參考文獻。
 
你應該老是明白你在作什麼,爲何,而不是簡單地複製隨機代碼,並指望它徹底解決你的使用場景。否則就會出現,因爲選擇了錯誤的工具或算法,而部署了許多包含重大安全或性能問題的應用程序。

 

設計原則:

JCA是圍繞這些原則設計的:

1.實現獨立性和互操做性

2.算法獨立性和可擴展性

實現獨立性和算法獨立性是互補的;您可使用加密服務(如數字簽名和消息摘要),而無需擔憂實現細節,甚至是構成這些概念基礎的算法。儘管徹底的算法獨立性是不可能的,但JCA提供了標準化的,算法特定的API。當實現獨立性不可取時,JCA讓開發人員指出具體的實現。

經過定義密碼「引擎」(服務)的類型,並定義提供這些密碼引擎的功能的類來實現算法獨立性。這些類被稱爲引擎類,例如MessageDigest,Signature,KeyFactory,KeyPairGenerator和Cipher類。

實現獨立性是使用基於「提供者」的體系結構實現的。術語密碼服務提供商(CSP)(在本文檔中與「提供商」可互換使用)是指實現一個或多個密碼服務(如數字簽名算法,消息摘要算法和密鑰轉換服務)的包或一組包。程序能夠簡單地請求實現特定服務(例如DSA簽名算法)的特定類型的對象(例如簽名對象),並從一個安裝的提供者得到實現。若是須要的話,程序能夠改成請求來自特定提供者的實現。提供商可能會更新透明的應用程序,例如,當更快或更安全的版本可用。

實現互操做性意味着各類實現能夠相互協做,使用彼此的密鑰,或者驗證彼此的簽名。這就意味着,例如,對於相同的算法,由一個提供者生成的密鑰能夠被另外一個提供者使用,而且由一個提供者生成的簽名能夠被另外一個提供者驗證。

算法可擴展性意味着能夠容易地添加適合於所支持的引擎類之一的新算法。

 

加密服務提供者:

java.security.Provider是全部安全提供程序的基類。每一個CSP都包含這個類的一個實例,它包含了提供者的名字,並列出了它實現的全部安全服務/算法。當須要特定算法的實例時,JCA框架會諮詢提供者的數據庫,若是找到合適的匹配項,則建立該實例。

提供者包含一個包(或一組包),爲廣告的加密算法提供具體的實現。每一個JDK安裝都默認安裝並配置了一個或多個提供程序。其餘提供者能夠靜態或動態添加(參見提供者和安全類)。客戶端能夠配置其運行時環境來指定提供程序的首選順序。首選順序是在沒有請求特定提供者時提供者搜索請求的服務的順序。

要使用JCA,應用程序只須要請求特定類型的對象(如MessageDigest)和特定的算法或服務(如「SHA-256」算法),並從一個已安裝的提供者獲取實現。或者,程序能夠請求來自特定提供者的對象。每一個提供者都有一個名字來引用它。

md = MessageDigest.getInstance("SHA-256");
md = MessageDigest.getInstance("SHA-256", "ProviderC");

 下圖說明了請求「SHA-256」消息摘要實現。這些圖顯示了實現各類消息摘要算法(「SHA-256」,「SHA-384」和「SHA-512」)的三個不一樣的提供者。提供者按照優先順序從左至右排列(1-3)。在第一個例子中,一個應用程序請求一個SHA-256算法實現而不指定提供者名稱。提供程序按優先順序搜索,並返回提供該特定算法ProviderB的第一個提供程序的實現。在第二個圖中,應用程序請求來自特定提供者ProviderC的SHA-256算法實現。此次ProviderC的實現被返回,即便具備更高優先級的提供者ProviderB也提供SHA-256實現。

JDK中的加密實現主要是出於歷史緣由經過幾個不一樣的提供者(Sun,SunJSSE,SunJCE,SunRsaSign)分發的,但在較小的程度上由它們提供的功能和算法的類型來分發。其餘Java運行時環境可能不必定包含這些Sun提供程序,所以除非知道特定的提供程序可用,不然應用程序不該請求提供程序特定的實現。

JCA提供了一組API,容許用戶查詢安裝哪些提供程序以及支持哪些服務。

提供者如何實際執行:

如前所述,經過定義全部應用程序用於訪問服務類型的通用高級應用程序編程接口(API)來實現算法獨立性。實現獨立性是經過使全部提供者實現符合定義良好的接口來實現的。引擎類的實例所以被具備相同方法簽名的實現類「支持」。應用程序調用經過引擎類路由,並傳遞到底層的後臺實現。該實現處理請求並返回正確的結果。

每一個引擎類中的應用程序API方法經過實現相應Service Provider Interface(SPI)的類路由到提供程序的實現。也就是說,對於每一個引擎類,都有一個相應的抽象SPI類,它定義了每一個加密服務提供者算法必須實現的方法。每一個SPI類的名稱與相應的引擎類相同,接着是Spi。例如,簽名引擎類提供對數字簽名算法的功能的訪問。實際的提供者實現是在SignatureSpi的子類中提供的。應用程序調用引擎類的API方法,在實際的實現中又調用SPI方法。

每一個SPI類都是抽象的。爲了爲特定算法提供特定類型的服務,提供者必須繼承相應的SPI類,並提供全部抽象方法的實現。

對於API中的每一個引擎類,經過調用引擎類中的getInstance()工廠方法來請求和實例化實現實例。工廠方法是一個返回一個類的實例的靜態方法。引擎類使用上述框架提供者選擇機制來獲取實際的後臺實現(SPI),而後建立實際的引擎對象。引擎類的每一個實例都封裝(做爲專用字段)相應SPI類的實例,稱爲SPI對象。 API對象的全部API方法都聲明爲final,而且它們的實現調用封裝SPI對象的相應SPI方法。
 
爲了使這個更清楚,請查看下面的代碼和插圖:
 
import javax.crypto.*;

Cipher c = Cipher.getInstance("AES");
c.init(ENCRYPT_MODE, key);

 

 

 

 
這裏的應用程序須要一個「AES」javax.crypto.Cipher實例,並不關心使用哪一個提供程序。應用程序調用Cipher引擎類的getInstance()工廠方法,而後請求JCA框架查找支持「AES」的第一個提供程序實例。該框架會諮詢每一個已安裝的提供者,並獲取提供者類的提供者實例。 (回想一下Provider類是可用算法的數據庫。)框架搜索每一個提供者,最後在CSP3中找到合適的條目。這個數據庫入口指向擴展CipherSpi的實現類com.foo.AESCipher,所以適用於Cipher引擎類。建立一個com.foo.AESCipher的實例,並將其封裝在一個新建立的javax.crypto.Cipher實例中,該實例返回給應用程序。當應用程序如今對Cipher實例執行init()操做時,Cipher引擎類將請求路由到com.foo.AESCipher類中相應的engineInit()支持方法。
 
 
密鑰管理
 
 
「密鑰庫」數據庫可用於管理密鑰和證書的存儲庫。密鑰庫可用於須要用於身份驗證,加密或簽名的數據的應用程序。
 
 
應用程序能夠經過java.security包中的KeyStore類的實現來訪問密鑰庫。建議的密鑰庫類型(格式)是「pkcs12」,它基於RSA PKCS12我的信息交換語法標準。默認的密鑰庫類型是「jks」,這是一種專有格式。其餘密鑰庫格式也是可用的,例如做爲替代專有密鑰庫格式的「jceks」,以及基於RSA PKCS11標準的「pkcs11」,而且支持對硬件安全模塊和智能卡等加密令牌的訪問。
 
 
應用程序能夠經過java.security包中的KeyStore類的實現來訪問密鑰庫。 Sun Microsystems提供了一個默認的KeyStore實現。它使用名爲「jks」的專有密鑰庫類型(格式)將密鑰庫做爲文件實現。其餘密鑰庫格式也是可用的,好比「jceks」,它是一種比「jks」更增強大的加密的專有密鑰庫格式,以及基於RSA PKCS12我的信息交換語法標準的「pkcs12」。
 
應用程序可使用上述相同的提供程序機制,從不一樣的提供程序中選擇不一樣的密鑰庫實現。
 
JCA概念
 
本節介紹主要的JCA API
 
引擎類和算法
 
引擎類爲特定類型的密碼服務提供接口,而不依賴於特定的密碼算法或提供者。引擎要麼提供:
 
  * 密碼操做(加密,數字簽名,消息摘要等),
  * 生成器或密碼材料的轉換器(密鑰和算法參數),或
  * 對象(密鑰庫或證書)封裝了密碼數據,能夠在更高的抽象層使用。
 
如下引擎類別可用:
 
  *SecureRandom:用於生成隨機或僞隨機數字。
  *MessageDigest:用於計算指定數據的消息摘要(散列)。
  *Signature:使用密鑰初始化,這些簽名用於簽署數據並驗證數字簽名。
  *Cipher:用密鑰初始化,用於加密/解密數據。存在各類類型的算法:對稱批量加密(例如AES),非對稱加密(例如RSA)和基於密碼的加密(例如PBE)。
  *Message Authentication Codes (MAC):與MessageDigests同樣,它們也會生成散列值,可是首先使用密鑰初始化以保護消息的完整性。
  *KeyFactory:用於將Key類型的現有不透明密鑰轉換爲密鑰規範(底層密鑰材料的透明表示),反之亦然。
  *SecretKeyFactory:用於將SecretKey類型的現有不透明加密密鑰轉換爲密鑰規範(底層密鑰材料的透明表示),反之亦然。 SecretKeyFactorys是特殊的只能建立密鑰(對稱)的KeyFactorys。
  *KeyPairGenerator:用於生成一對適用於指定算法的公鑰和私鑰。
  *KeyGenerator:用於生成與指定算法一塊兒使用的新密鑰。
  *KeyAgreement:由兩方或多方使用,商定和創建一個特定的密鑰,用於特定的密碼操做。
  *AlgorithmParameters:用於存儲特定算法的參數,包括參數編碼和解碼。
  *AlgorithmParameterGenerator:用於生成適合於指定算法的一組AlgorithmParameters。
  *KeyStore:用於建立和管理密鑰庫。密鑰庫是密鑰的數據庫。密鑰庫中的私鑰具備與其關聯的證書鏈,用於驗證相應的公鑰。密鑰庫還包含來自可信實體的證書。
  *CertificateFactory:用於建立公鑰證書和證書吊銷列表(CRL)。
  *CertPathBuilder:用於構建證書鏈(也稱爲證書路徑)。
  * CertPathValidator:用於驗證證書鏈。
  *CertStore:用於從存儲庫中檢索證書和CRL。
 
注意:生成器建立具備全新內容的對象,而工廠從現有元素(例如編碼)建立對象。
 
核心類和接口
 
本節討論JCA中提供的核心類和接口:
 
  *the Provider and Security 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.
 
本部分顯示每一個類和接口中主要方法的簽名。其中一些類(MessageDigest,Signature,KeyPairGenerator,SecureRandom,KeyFactory和關鍵規範類)的示例在相應的示例部分中提供。
 
相關安全API軟件包的完整參考文檔能夠在軟件包摘要中找到
 
java.security
javax.crypto
java.security.cert
java.security.spec
javax.crypto.spec
java.security.interfaces
javax.crypto.interfaces

The Provider Class

術語「加密服務提供者」(在本文檔中與「提供者」可互換使用)是指提供JDK安全API加密特徵子集的具體實現的一個或一組包。 Provider類是這種包或一組包的接口。它具備訪問提供程序名稱,版本號和其餘信息的方法。請注意,除了註冊加密服務的實現以外,Provider類還能夠用於註冊可能被定義爲JDK安全API或其擴展之一的其餘安全服務的實現。

爲了提供加密服務的實現,實體(例如開發組)編寫實現代碼並建立提供者類的子類。 Provider子類的構造函數設置各類屬性的值; JDK安全API使用這些值來查找提供者實現的服務。換句話說,子類指定實現服務的類的名稱。

 

 

不一樣的實現可能具備不一樣的特性。有些多是基於軟件的,有些多是基於硬件的。有些多是平臺無關的,有些多是平臺特定的。一些供應商的源代碼可能可用於審查和評估,而有些則可能不可用。 JCA讓最終用戶和開發者決定他們的需求。

在本節中,咱們解釋最終用戶如何安裝符合他們需求的加密實現,以及開發人員如何請求適合他們的實現。

詳細參見:https://docs.oracle.com/javase/7/docs/technotes/guides/security/crypto/CryptoSpec.html

相關文章
相關標籤/搜索