版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、制的服務(wù),以利用特定操作平臺(tái)(例如L inux)上好的隨機(jī)數(shù)資源??紤]到A PI設(shè)計(jì)的一般性,從某種程度上說,即使是各種實(shí)現(xiàn)有不同的特性,也可得到實(shí)現(xiàn)的相互作用性。它們可以共同運(yùn)行,例如,相互使用密鑰,相互驗(yàn)證簽名。例如,當(dāng)某個(gè)密鑰工廠實(shí)現(xiàn)被安裝,對(duì)于同樣的算法,由一個(gè)提供器產(chǎn)生的密鑰可由另一個(gè)提供器使用.同樣,由一個(gè)提供器產(chǎn)生的簽名可由其他提供器來驗(yàn)證。即使一個(gè)提供器在軟件中運(yùn)行,而另一個(gè)提供器在硬件中運(yùn)行;或一個(gè)與平臺(tái)無關(guān),而另一個(gè)與指定的平臺(tái)相關(guān),這種相互作用性也可以得到實(shí)現(xiàn)。界面設(shè)計(jì)也可以得到擴(kuò)展,因?yàn)榭奢p易添加與所支持的服務(wù)類相匹配的新算法。圖7 -1描述了J CA結(jié)構(gòu)的大體輪廓。遵
2、循前面提出的兩個(gè)設(shè)計(jì)原則,J CA為密碼軟件市場(chǎng)帶來了巨大的利益。一方面,對(duì)于軟件開發(fā)者來說,可以只關(guān)心一套A PI,而不用理會(huì)采用何種算法,安裝哪一種提供器程序包。另一方面,密碼工具包,或是數(shù)據(jù)庫可以在智能屬性上(例如已模塊化的算法和技術(shù))達(dá)到相互一致,從而使性能得以優(yōu)化,在J CAAPI中,可保持各種實(shí)現(xiàn)的完全相互作用性。圖7-1 JCA結(jié)構(gòu)7.2 密碼服務(wù)和服務(wù)提供器J CA介紹了C SP的概念。在J CA1.1中,提供器有一種操作,包含一個(gè)或多個(gè)簽名算法、消息摘要算法、密鑰產(chǎn)生算法。在J DK1.2中,又增加了五種服務(wù): 密鑰工廠。 密鑰庫創(chuàng)建與密鑰管理。 算法參數(shù)管理。 算法參數(shù)產(chǎn)生
3、。 證書工廠。J DK1.2中也提供了一種隨機(jī)數(shù)產(chǎn)生( RNG)算法。在J DK的典型安裝中,安裝了一個(gè)或者幾個(gè)提供器程序包。用戶可以通過靜態(tài)或動(dòng)態(tài)的方式,添加新的提供器。每一提供器以唯一的名稱被引用。用戶可以用不同的提供器來配置自己的運(yùn)行時(shí)間,并指定優(yōu)先級(jí)次序。J CA提供了一套A PI。允許用戶查詢安裝了哪些提供器及它們所提供的服務(wù),如果一個(gè)應(yīng)用程序要求一個(gè)指定的提供器。那么從提供器中僅返回對(duì)象。如果指定的提供器不存在,那么只能使用缺省的提供器。當(dāng)多個(gè)提供器同時(shí)可用時(shí),那么將建立一個(gè)優(yōu)先級(jí)次序。這個(gè)次序也是查找請(qǐng)求的服務(wù)的次序。當(dāng)最高級(jí)提供器中沒有提供請(qǐng)求服務(wù)時(shí),那么將依照優(yōu)先級(jí)次序查詢下
4、一個(gè)提供器。例如,假設(shè)在你的J VM環(huán)境中已安裝了兩個(gè)提供器:P rovider1和P rovider2,進(jìn)一步假設(shè),P rovider1實(shí)現(xiàn)帶有DSA SHA1和M D5算法,而P rovider2實(shí)現(xiàn)帶有DSA SHA1、RSA MD5 及M D5算法。如果P rovider1的優(yōu)先級(jí)次序是1 (最高優(yōu)先級(jí)),P rovider2的優(yōu)先級(jí)次序是2,那么有可能遇到下面幾種情況:(1) 如果你想實(shí)現(xiàn)M D5,兩個(gè)提供器都提供這樣的實(shí)現(xiàn),由于P rovider1擁有最高優(yōu)先級(jí),因此最先被查找,所以返回P rovider1的實(shí)現(xiàn)。RSA MD5 ,優(yōu)先查找P rovider1,但沒有發(fā)現(xiàn)這樣的實(shí)現(xiàn)
5、,于是依序查(2) 如果你想實(shí)現(xiàn)找P rovider2,實(shí)現(xiàn)被發(fā)現(xiàn)并返回。( 3)如果你想實(shí)現(xiàn)RSA SHA1,兩個(gè)提供器都沒有安裝該實(shí)現(xiàn),于是出現(xiàn)AlgorithmException。J ava運(yùn)行時(shí)間環(huán)境S un版本,提供一個(gè)缺省的提供器S UN,其余的J ava運(yùn)行時(shí)間環(huán)境沒有必要提供這個(gè)S UN提供器。S UN提供器程序包包含下列實(shí)現(xiàn): NIST FIPS186中描述的數(shù)字簽名算法( DSA)。 MD5(RFC 1321)和SHA-1(NIST FIPS180-1)消息摘要算法。 DSA 密鑰對(duì)產(chǎn)生器能產(chǎn)生與D SA算法相匹配的公鑰與私鑰對(duì)。 DSA算法參數(shù)產(chǎn)生器。 DSA 算法參數(shù)管
6、理器。 DSA 密鑰工廠,能夠在(不透明的) DSA私鑰及公鑰對(duì)象與基本的密鑰材料之間,提供一種雙向轉(zhuǎn)換。 專有S HA1PRNG偽隨機(jī)數(shù)產(chǎn)生算法,該算法出自IEEE P1363標(biāo)準(zhǔn)建議書。 X.509證書和C RL的證書工廠。 專有密鑰庫類型J KS。服務(wù)類以一種抽象方式定義密碼服務(wù),而且沒有具體的實(shí)現(xiàn),密碼服務(wù)總是與一特定的算法相關(guān)聯(lián),它可以提供下列實(shí)現(xiàn): 密碼操作(如數(shù)字簽名和消息摘要)。 密碼操作所需的加密材料(密鑰和參數(shù))。 數(shù)據(jù)對(duì)象(密鑰庫和證書),以一種安全方式壓縮用于加密操作的密鑰。服務(wù)類的一個(gè)例子S i g n a t u r e,提供對(duì)D S A功能的訪問。D S A密鑰工
7、廠通過調(diào)用D SASignature對(duì)象中的i nitSign或i nitVe rity方法,提供D SA公鑰或私鑰。程序員可以請(qǐng)求并使用服務(wù)類的實(shí)例,執(zhí)行相應(yīng)的操作,J DK1.2中定義了下列服務(wù)類: MessageDigest:用來記錄指定數(shù)據(jù)的消息摘要。 Signature:簽署數(shù)據(jù)并驗(yàn)證數(shù)字簽名。 KeyPairGenerator : 產(chǎn)生與指定算法相匹配的公鑰和私鑰s。N oSuch KeyFactory:將類型為K ey的模糊密鑰轉(zhuǎn)換為清晰密鑰。反之亦然。 CertificateFactory:創(chuàng)建公鑰證書和C RL。 KeyStore:創(chuàng)建和管理密鑰庫。 Algorithm Pa
8、rameter:管理特定算法的參數(shù),包括參數(shù)的編碼和解碼。 Algorithm Parameter Generator:產(chǎn)生與指定算法相匹配的一系列參數(shù)。 SecureRandom: 產(chǎn)生隨機(jī)或偽隨機(jī)數(shù)。在J CA語境中,產(chǎn)生器和工廠的不同點(diǎn)在于前者以新的內(nèi)容創(chuàng)建一個(gè)對(duì)象,而后者是從已有材料(如編碼)中創(chuàng)建對(duì)象。服務(wù)類為指定類型的密碼服務(wù)的功能提供了界面,這種服務(wù)獨(dú)立于特定的加密算法。它定義了A PI,使應(yīng)用程序能夠訪問指定的加密服務(wù)。對(duì)于一個(gè)或多個(gè)提供器而言,真正的實(shí)現(xiàn)是它們各自的算法。服務(wù)類提供的應(yīng)用程序界面由S PI(服務(wù)提供器界面)實(shí)現(xiàn)。也就是說,對(duì)于每一個(gè)服務(wù)類,都有一個(gè)抽象S PI
9、類,由它來定義密碼服務(wù)提供器必須實(shí)現(xiàn)的S PI方法。例如,S ignature服務(wù)類提供訪問D SA功能的服務(wù),由S ignatureSpi子類提供的真正實(shí)現(xiàn)將針對(duì)指定類型的簽名算法,如帶有DSA SHA1、RSA SHA1或RSA MD5。服務(wù)類的一個(gè)實(shí)例A PI對(duì)象(和與之對(duì)應(yīng)的S PI類)通過調(diào)用服務(wù)類中的getInstance( )方法來創(chuàng)建該實(shí)例(作為一個(gè)私有域)被壓縮對(duì)應(yīng)S PI類和S PI對(duì)象的實(shí)例。所有A PI對(duì)象中的A PI方法最終都會(huì)被聲明,并且它們的實(shí)現(xiàn)激活了被壓縮的S PI對(duì)象中相應(yīng)的S PI方法(見圖7 -2)。API類SPI類圖7-2 服務(wù)類中的API和SPI每個(gè)S
10、 PI類的名字與相應(yīng)的服務(wù)類的名字相一致,例如,與S ignature服務(wù)類對(duì)應(yīng)的S PI類的名稱是Signature Spi。S PI類是抽象類。對(duì)于一個(gè)指定的算法來說,為了提供一個(gè)特殊類型服務(wù)的實(shí)現(xiàn),提供器必須使相應(yīng)的S PI類成為子類,并為所有的抽象方法提供實(shí)現(xiàn)。另一個(gè)服務(wù)類的例子是M essageDigest類。它提供訪問消息摘要算法。在M essageDigestS pi子類中,它的實(shí)現(xiàn)實(shí)質(zhì)上是各種消息摘要算法,如S HA-1、M D5或M D2。最后一個(gè)例子是K e y F a c t o r y服務(wù)類,提供從模糊密鑰到清晰密鑰類型的轉(zhuǎn)換。在K eyFactorySpi子類中,真正
11、的實(shí)現(xiàn)是密鑰的指定類型,如D SA公鑰和私鑰。JCA CSP提供各種密碼服務(wù)實(shí)現(xiàn),如S UN。提供器也可以實(shí)現(xiàn)不可用的服務(wù),例如基于R SA的簽名算法或者M(jìn) D2消息摘要算法。安裝和添加提供器假如你是一個(gè)用戶,為了得到一個(gè)合適的對(duì)象,如S ignature對(duì)象,你可以調(diào)用S ignature類中的g etInstance方法,并指定一個(gè)簽名算法(如:帶有DSA SHA1)和能提供所需實(shí)現(xiàn)的提供器例如,政府機(jī)關(guān)可能需要接收政府驗(yàn)證的實(shí)現(xiàn)。如果你想使用的提供器沒有安裝,即使在其他已安裝的提供器中包含有所需的實(shí)現(xiàn)算法。那么也會(huì)出現(xiàn)N oSuchProviderException,所以必須安裝所需要的
12、提供器。這就涉及到了安裝和配置提供器程序包的問題??梢圆捎靡韵聝煞N方法安裝提供器類: 將包含提供器類的Z IP和J AR文件放在C LASSPAT H下。 將提供器J AR文件作為已安裝和綁定的文件擴(kuò)展。下一步,可以用動(dòng)態(tài)或靜態(tài)的方法將提供器添加到已批準(zhǔn)的提供器列表中。如果在靜態(tài)條件下實(shí)現(xiàn)這一點(diǎn),可以編輯J ava安全屬性文件,可以設(shè)置的一個(gè)屬性是:s vider.n=masterClassName這一設(shè)置定義了一個(gè)提供器,并指定了它的優(yōu)先級(jí)次序n。提供器優(yōu)先級(jí)次序也就是查找請(qǐng)求的算法的次序。m asterClassName指定提供器的主類(master class),這
13、一點(diǎn)在提供器的資源文件中設(shè)置,此類總是P rovider類的子類。它的構(gòu)造器設(shè)置各種屬性,在J CA的A PI中,提供器通過屬性查找請(qǐng)求的算法和其他設(shè)施。假設(shè)主類是C OM.vider. Abcd,為了將A bcd的優(yōu)先級(jí)設(shè)置為3,可以在安全屬性文件中加入一行:也可以在S ecurity類中,通過調(diào)用a ddProvider或i nsertPr oviderAt方法,動(dòng)態(tài)地注冊(cè)提供器。注冊(cè)類型也不是一成不變的,但只能由被賦予充足許可權(quán)的可信程序來完成。例如,下面的策略表明,只有從本地文件系統(tǒng)中目錄/ home/sysadmin/下署名為J AR文件加載的代碼,可以調(diào)用S ecu
14、rity類中的方法,實(shí)現(xiàn)添加和刪除提供器或者設(shè)置安全屬性。(通過使用用戶密鑰庫中別名為s ysadmin的公鑰,來驗(yàn)證J AR文件的簽名)。7.3 密碼類本節(jié)將討論J CA核心類的設(shè)計(jì)和用法。S ecurity類管理已安裝的提供器和安全方面的屬性。它僅包含靜態(tài)方法,因此不能用具體的例子來說明。g etProviders()方法返回一個(gè)包含所有已安裝提供器的數(shù)組,提供器在數(shù)組中的次序?qū)?yīng)著它們的優(yōu)先級(jí)次序。a ddProvider方法將一個(gè)提供器加到已安裝提供器列表的結(jié)尾,并返回提供器的優(yōu)先級(jí)位置值。如果這個(gè)提供器已經(jīng)被安裝,那么再次添加是無效的,返回值是1。i nsertProvider方法在
15、搜索請(qǐng)求算法的提供器中指定一個(gè)位置,并插入新的提供器。(如果沒有指定提供器)。如果這個(gè)提供器已存在,那么不能再次添加。如果給定的提供器安裝在指定的位置,那么原來位于這個(gè)位置和優(yōu)先級(jí)小于此位置的提供器依次下移,此方法返回值是所增加提供器的優(yōu)先級(jí)。如果提供器已存在,那么返回值為1。r emoveProvider方法刪除已命名的提供器,如果已命名的提供器沒有安裝,那么將返回缺省值。如果指定的提供器被刪除,那么所有優(yōu)先級(jí)低于該提供器的提供器依次上移。如果要改變某個(gè)已安裝提供器的優(yōu)先級(jí)位置,應(yīng)當(dāng)首先刪除它,然后再將其插入到新的優(yōu)先級(jí)位置。每個(gè)P rovider類實(shí)例都有自己的名字、版本號(hào)及字符串描述和它
16、所提供的服務(wù)??梢酝ㄟ^調(diào)用下列方法來查詢P rovider實(shí)例:public String getName( )public double getVersion( )public String getInfo( )M essageDigest類是一種提供密碼安全消息摘要,如SHA1 MD5功能的服務(wù)類。密碼安全消息摘要采用任意長度的輸入,然后產(chǎn)生一個(gè)固定長度的輸出,稱為一個(gè)摘要或散列。因?yàn)閮蓚€(gè)不同消息的散列值不可能相同,因此,從消息摘要中不可能得到生成它的輸入,故消息摘要有時(shí)又被稱為數(shù)據(jù)的“數(shù)字水印”。為了計(jì)算消息摘要,首先應(yīng)創(chuàng)建一個(gè)消息摘要實(shí)例,與所有的服務(wù)類一樣,對(duì)于特定類型的消息摘要算法
17、而言,可通過調(diào)用M essageDigest類中的g etInstance靜態(tài)方法得到M esssageD igest對(duì)象:public static MessageDigest getInstance(String algorithm)算法名對(duì)大小寫不敏感,例如,下列調(diào)用方法都是相等的:M essageDigest.getInstance("SHA")M essageDigest.getInstance("sha")M essageDigest.getInstance("sHa")調(diào)用者可以任意指定提供器名,但必須保證請(qǐng)求算法的實(shí)現(xiàn)
18、出自己命名的提供器:public static MessageDigest getInstance(String algorithm,String provider)調(diào)用g etInstance方法,返回一個(gè)被初始化的消息摘要對(duì)象,因此不需要進(jìn)一步初始化對(duì)象。下一步,為計(jì)算一些數(shù)據(jù)的摘要,應(yīng)當(dāng)向被初始化的消息摘要對(duì)象提供數(shù)據(jù)。這一點(diǎn)可通過調(diào)用下列已更新的方法來實(shí)現(xiàn)。public void update(byte input)public void update(byte input)public void update(byte input,int offset,int len)通過調(diào)用更新的
19、方法提供數(shù)據(jù)后,可運(yùn)用下列摘要方法計(jì)算摘要:public byte digest( )public byte digest(byte ,input )public int digest(byte buf, int offset ,int len)前兩個(gè)方法返回已計(jì)算的摘要,第三個(gè)方法將計(jì)算得到的摘要存儲(chǔ)在提供器的b uf緩存中,從o ff set開始, len是分配給摘要的字節(jié)數(shù)。上述方法返回存儲(chǔ)在b uf中的真正字節(jié)數(shù)。調(diào)用以b yte數(shù)組參數(shù)作為輸入的摘要方法,等效于在無參數(shù)的分類方法調(diào)用之后再調(diào)用指定輸入的public void updata(byte input)。S ignature
20、類是一種提供密碼數(shù)字簽名算法,如DSA SHA1和RSA MD5功能的服務(wù)類。密碼安全性簽名算法,采用任意長度數(shù)據(jù)和私鑰作為輸入,產(chǎn)生一個(gè)固定長度的字符串簽名,簽名具有下列屬性:(1) 當(dāng)提供與產(chǎn)生簽名的私鑰相應(yīng)的公鑰時(shí),就可以驗(yàn)證輸入的可靠性和完整性。(2) 簽名和公鑰不能揭露任何私鑰信息。S ignature對(duì)象可以用來簽署數(shù)據(jù),通常也可以用來驗(yàn)證簽名是否是相關(guān)數(shù)據(jù)的合法簽名。S ignature對(duì)象屬于模式( modal)對(duì)象。也就是說, Signature對(duì)象總是處于某個(gè)特定狀態(tài),對(duì)它只能進(jìn)行特定類型的操作。對(duì)象所處狀態(tài)在它們各自的類中(如S ignature)以最終整型常量表示。通常
21、一個(gè)簽名對(duì)象有三種狀態(tài):(1) UNINITIALIZED(未初始化)。(2) SIGN(簽名)。(3) VERIFY(驗(yàn)證)。為了簽名和驗(yàn)證簽名,首先創(chuàng)建S ignature實(shí)例。正如所有服務(wù)類一樣,通過調(diào)用S ignature類中的getInstance 靜態(tài)方法可以獲得具有特定簽名算法的S ignature對(duì)象。public static Signature getInstance(String algorithm)public static Signature getInstance(String algorithm,String provider)S ignature對(duì)象在創(chuàng)建時(shí)處于
22、U NINITIALIZED狀態(tài),所以在使用前,必須先對(duì)其進(jìn)行初始化。S ignature類定義了兩種初始化方法i nitSign和i nitVe rify,它們可以分別將S ignature對(duì)象的狀態(tài)轉(zhuǎn)換成S IGN和V ERIFY狀態(tài)。到底采用哪一種方法,主要取決于是想對(duì)S ignature對(duì)象進(jìn)行簽名操作還是驗(yàn)證操作。如要進(jìn)行簽名操作,需用產(chǎn)生簽名的實(shí)體的私鑰初始化對(duì)象,這可通過調(diào)用i nitSign方法實(shí)現(xiàn):public final void initSign(PrivateKey privateKey)調(diào)用這種方法使S ignature對(duì)象處于S IGN狀態(tài)。如要進(jìn)行驗(yàn)證操作,需用產(chǎn)
23、生簽名的實(shí)體的公鑰初始化對(duì)象,這可通過調(diào)用i nitVe rify方法實(shí)現(xiàn):public final void initVerify(PublicKey publicKey)調(diào)用這種方法使S ignature對(duì)象處于V ERIFY狀態(tài)。如果S ignature對(duì)象已經(jīng)進(jìn)行了簽名初始化(已經(jīng)處于S IGN狀態(tài)),就可以將待簽署的數(shù)據(jù)傳遞給對(duì)象,這可通過調(diào)用一次或多次u pdate方法之一來實(shí)現(xiàn):public final void update(byte b)public final void update(byte data),int off,int len)p ublicfinal void
24、update(byte data對(duì)u pdate方法的調(diào)用一直持續(xù)到所有待簽署的數(shù)據(jù)全部傳遞給了S ignature對(duì)象。為了產(chǎn)生簽名,只需簡(jiǎn)單地調(diào)用s ign方法:public final byte sign()public final int sign(byte outbuf,int offset,int len)第一種方法以b yte數(shù)組形式返回簽名。第二種方法返回的簽名結(jié)果存儲(chǔ)在設(shè)定的緩沖區(qū)o utbuf中,o ff set表示緩沖區(qū)的初值,l en表示o utbuf的長度,這種方法返回的是實(shí)際存儲(chǔ)的字節(jié)數(shù)。簽名可被帶有兩個(gè)整型參數(shù)r、s的標(biāo)準(zhǔn)A SN.1序列編碼。調(diào)用s ign方法可
25、以重置S ignature對(duì)象狀態(tài),使它返回到調(diào)用i nitSign方法前的狀態(tài)。也就是說S ignature對(duì)象被重置,并且可以通過重新調(diào)用u pdata和s ign,用同一個(gè)私鑰產(chǎn)生另一個(gè)不同的簽名。相對(duì)地,可以重新調(diào)用i n i t S i g n指定不同私鑰,或者重新調(diào)用i n i t Ve r i f y初始化S ignature對(duì)象驗(yàn)證簽名。如果S ignature對(duì)象已經(jīng)進(jìn)行了驗(yàn)證初始化(已經(jīng)處于V ERIFY狀態(tài)),則可以通過向?qū)ο筇峁?yàn)證數(shù)據(jù)(這個(gè)過程與簽名過程相反)來驗(yàn)證簽名是否是相關(guān)數(shù)據(jù)的合法簽名。這可以通過一次或多次調(diào)用u pdate方法之一來實(shí)現(xiàn):public fin
26、al void update(byte b)public final void update(byte data)public final void update(byte data,int off,int len)對(duì)u pdate方法的調(diào)用一直持續(xù)到向S ignature對(duì)象提供了所有的驗(yàn)證數(shù)據(jù)為止??梢酝ㄟ^調(diào)用v erify方法來驗(yàn)證簽名:public final boolean verify(byte encodedSignature)參數(shù)必須是包含簽名的b yte數(shù)組,該簽名可被帶有兩個(gè)整型參數(shù)r、s的標(biāo)準(zhǔn)A SN.1序列編碼。這是一種常用的標(biāo)準(zhǔn)編碼。這與S ign方法產(chǎn)生的結(jié)果相同。
27、v erify方法返回一個(gè)b oolean,以指示編碼的簽名是否是u pdate方法所提供數(shù)據(jù)的合法簽名。調(diào)用v erify方法可以重置S ignature對(duì)象狀態(tài),使它返回到調(diào)用i nitVe rify方法前的狀態(tài)。也就是說簽名對(duì)象被重置,并且可以驗(yàn)證身份的另一個(gè)簽名,該身份的公鑰在調(diào)用i nitVe rify時(shí)指定。相對(duì)地,重新調(diào)用i nitVe rify以不同公鑰初始化S ignature對(duì)象來驗(yàn)證不同實(shí)體的簽名,或者重新調(diào)用i nitSign初始化S ignature對(duì)象來產(chǎn)生簽名。7.3.5 算法參數(shù)J CA可用來處理密碼算法。不同的算法有很大的差異。每一種算法都有自己的參數(shù)(密鑰大
28、小和被定義常數(shù))。為了組織這些參數(shù),每種算法都有一種算法參數(shù)規(guī)格說明,這些說明被分成一些小的類集。算法參數(shù)規(guī)格說明是算法所用參數(shù)集的清晰( transparent)表示。這意味著可以獨(dú)立訪問每一個(gè)參數(shù),雖然相應(yīng)的規(guī)格說明類中定義了g et方法(如, DSAParameterSpec定義了g etp、g etQ、g e t G方法,它們可以分別訪問p、q、g參數(shù))。相反的,在模糊( o p a q u e )表示中,正如A lgorithmParameters類所提供的,不能直接訪問參數(shù)域。不過可以得到與參數(shù)集有關(guān)的算法名A lgorithmParameters對(duì)象轉(zhuǎn)換成清晰說明。算法參數(shù)規(guī)格說
29、明界面和類(調(diào)用g etAlgorithm)和參數(shù)集的編碼方法(調(diào)用g etEncoded)??梢哉{(diào)用g etParameterSpec方法,把下面討論j ava.security和j ava.scurity. spec包中的算法參數(shù)規(guī)格說明界口和類: AlgorithmParameterSpec DSAParameterSpec AlgorithmParameters AlgorithmParameterGenerator1. AlgorithmParameterSpec對(duì)于密碼參數(shù)的清晰說明, AlgorithmParameterSpec是一種基本界面,它不含方法或常數(shù)。它的唯一目的是對(duì)所
30、有參數(shù)說明分組。所有參數(shù)說明必須實(shí)現(xiàn)這個(gè)界面。2. DSAParameterSpec這個(gè)類指定了D SA算法所用的參數(shù)集,用以實(shí)現(xiàn)A lgorithmParameter界面。它有三種方法:public BigInteger getP()public BigInteger getQ()public BigInteger getG()這三種方法分別返回D SA算法參數(shù):主要參數(shù)p、次要參數(shù)q、基數(shù)g。3. AlgorithmParameters這種服務(wù)類提供密碼參數(shù)的模糊表示。像所有服務(wù)類一樣,通過調(diào)用g etInstance靜態(tài)方法可以獲得特定算法類的對(duì)象,并且可以有選擇地指定提供器名,以確保算
31、法參數(shù)實(shí)現(xiàn)來自命名的提供器。public static AlgorithmParameters getInstance(String algorithm)public static AlgorithmParameters getInstance(String algorithm,String provider)一旦AlgorithmParameters 對(duì)象實(shí)例化后,必須使用合適的參數(shù)說明及編碼調(diào)用i nit進(jìn)行初始化。public void init(AlgorithmParameterSpec paramSpec)public void init(byte params)public vo
32、id init(byte params,String format)其中,p arams是含有編碼參數(shù)的數(shù)組,f ormat是解碼格式名。在含有p arams參數(shù),而沒有f ormat參數(shù)的i n i t方法中,使用基本解碼格式。如果A S N . 1參數(shù)說明存在,則基本的解碼格式是A SN.1。注意: AlgorithmParameter對(duì)象只能進(jìn)行一次初始化,即不能重用。在A lgorithmParameters對(duì)象中,通過調(diào)用g etEncoded方法可獲得字節(jié)型參數(shù)編碼:public byte getEncoded()其返回值是基本編碼格式的參數(shù)。為了獲得指定編碼格式參數(shù),可以調(diào)用帶有
33、f ormat參數(shù)的g etEncoded方法:public byte getEncoded(String format)如果f ormat參數(shù)為空,正如其他g etEncoded算法參數(shù)的清晰說明可以通過調(diào)用A lgorithmParameters對(duì)象的g etParameteSpec方法獲得:public AlgorithmParameterSpec getParameterSpec(Class paramSpec)p a r a m S p e c指定將返回的參數(shù)的說明類。例如,D SAParameterSpec的實(shí)例返回的參數(shù)。4. AlgorithmParametersGenerat
34、orD S A P a r a m e t e r S p e c . c l a s s ,將指明這種服務(wù)類在創(chuàng)建AlgorithmParameter Generator實(shí)例后,可以產(chǎn)生指定算法的參數(shù)集。為了獲得特定算法的A lgorithmParameterGenerator對(duì)象,可以調(diào)用A lgorithmParameterGenerator類中的getInstance 靜態(tài)方法:public static AlgorithmParameterGenerator getInstance(String algorithm)public static AlgorithmParameterGe
35、nerator getInstance(String algorithm,String provider)AlgorithmParamerGenerator 對(duì)象可用下列兩種方式之一進(jìn)行初始化: 算法無關(guān)方式。 特定算法方式。算法無關(guān)方式基于所有參數(shù)產(chǎn)生器共享隨機(jī)數(shù)源和大小這一事實(shí)。雖然所有算法參數(shù)都用到大小這一概念,但是不同算法的大小含義不同,例如,D SA算法中,大小以位的形式表示基本模數(shù)。使用這種方法后, 特定算法方式參數(shù)產(chǎn)生值缺省為一些標(biāo)準(zhǔn)值。i nit方法使用這兩個(gè)廣泛應(yīng)用的參數(shù)類型。另一種i nit方法則只使用s ize參數(shù),其r andom是系統(tǒng)缺省值。public void i
36、nit(int size,SecureRandom random);public void init(int size)在特定算法方式中,參數(shù)產(chǎn)生器對(duì)象必須采用特定算法語句進(jìn)行初始化,該語句可由AlgorithmParameterSpec 對(duì)象中特定算法參數(shù)產(chǎn)生值表示。public void init(AlgorithmParameterSpec genParamSpec,SecureRandom random)public void init(AlgorithmParameterSpec genParamSpec)在系統(tǒng)參數(shù)產(chǎn)生過程中,如D iff ie-Hellman方案中,參數(shù)產(chǎn)生值通常
37、包含基本模數(shù)的大小和隨機(jī)指數(shù)的大小,兩者均以位的形式表示。D iff ie-Hellman的算法是J CE1.2的一部分,不在J DK范圍之內(nèi)。一旦創(chuàng)建并初始化了A lgorithmParameterGenerator對(duì)象,則可以調(diào)用g enerateParameters方法產(chǎn)生算法參數(shù):public AlgorithmParameters generateParameters()本節(jié)討論下面的界面和子界面: Key PublicKey PrivateKey KeySpec1. KeyK ey是所有模糊密鑰中最高層的界面,它定義了所有模糊密鑰對(duì)象的共享功能。模糊密鑰具有以下三個(gè)特性: 算法密鑰
38、算法。 編碼形式。 格式。密鑰算法指的是像D SA或R SA等與密鑰有關(guān)的算法,它們結(jié)合RSA MD5和RSA SHA1等算法一起工作。密鑰算法名稱可通過調(diào)用g et方法獲得:public String getAlgorithm()編碼形式是密鑰的外部編碼形式,當(dāng)J VM外部(如發(fā)送密鑰到第三方時(shí))需要密鑰的標(biāo)準(zhǔn)表示時(shí),要用到編碼形式。密鑰按照標(biāo)準(zhǔn)格式(如X .509或P KCS#8)編碼,可通過調(diào)用g et方法得到編碼形式:public byte getEncoded()格式是經(jīng)過編碼后的密鑰格式,可以通過調(diào)用g et方法獲得:public String getFormat()密鑰可以通過密
39、鑰產(chǎn)生器、證書、密鑰說明(使用K eyFactory)或K eyStore實(shí)現(xiàn)等訪問管理密鑰的密鑰庫來獲得。利用K eyFactory,可以用特定算法方式分析已編碼密鑰。同樣,也可以用C ertificateFactory分析證書。2. PublicKey和P rivateKeyP ublicKey和P rivateKey界面均是對(duì)K ey界面的擴(kuò)展。它們不提供方法,只為了實(shí)現(xiàn)類型安全和類型辨識(shí)。密鑰說明是密鑰材料的清晰表示。如果密鑰存儲(chǔ)在硬件設(shè)備中,它的說明可能包含辨識(shí)密鑰的信息。密鑰的清晰意味著通過調(diào)用說明類中的g et方法可以分別訪問每一個(gè)密鑰材料值。例如:D SAPrivateKeyS
40、pec中的g etX、g etP、g etQ、g etG方法可以訪問私鑰x和用于計(jì)算密鑰的D SA算法參數(shù):主要參數(shù)p、次要參數(shù)q和基數(shù)g。密鑰可以用指定算法方式或算法無關(guān)方式編碼格式(如A SN.1)規(guī)定。如:D SA私鑰可由參數(shù)x、p、q規(guī)定,也可以用D ER編碼規(guī)定。3. KeySpecK eySpec界面不提供方法和常量。它唯一的目的是為所有密鑰說明提供類型安全。所有密鑰說明必須實(shí)現(xiàn)這個(gè)界面。 D SAPrivateKeySpec。此類實(shí)現(xiàn)K eySpec界面并借助相關(guān)參數(shù)規(guī)定了D SA私鑰。它提供下列方法返回私鑰x,使用如下D SA算法參數(shù):主要參數(shù)p、次要參數(shù)q和基數(shù)g。publi
41、c BigInteger getX()public BigInteger getP()public BigInteger getQ()public BigInteger getG() D SAPublicKeySpec。此類實(shí)現(xiàn)K eySpec界面并借助相關(guān)參數(shù)規(guī)定了D SA公鑰。它提供下列方法返回公鑰y,使用如下D SA算法參數(shù):主要參數(shù)p、次要參數(shù)q和基數(shù)g。public BigInteger getY()public BigInteger getP()public BigInteger getQ()public BigInteger getG() R SAPrivateKeySpec。此
42、類實(shí)現(xiàn)K eySpec界面并借助相關(guān)參數(shù)規(guī)定了R SA私鑰。它提供下列方法返回組成R SA私鑰的模數(shù)n和私有指數(shù)d。public BigInteger getMdulus()public BigInteger getPrivateExponent() R SAPrivateCrtKeySpec。此類是R SAPrivateKeySpec類的一種擴(kuò)展,它以C RT信息值規(guī)定一個(gè)R SA私鑰(如P KCS#1標(biāo)準(zhǔn)中所定義的)。除了從其子類R SAPrivateKeySpec中繼承的方法外,還提供下列方法:public BigInteger getPublicExponent()public Big
43、Integer getPrimeP()public BigInteger getPrimeQ()public BigInteger getPrimeExponentP()public BigInteger getPrimeExponentQ()public BigInteger getCrtCoefficient()這些方法分別返回公共指數(shù)e和C RT信息整數(shù):模數(shù)n的主要因子p、n的主要因子q,指數(shù)d模( p-1)指數(shù)d模( q-1)和C RT系數(shù)模p。在邏輯上,R SA私鑰只包含模數(shù)和私有指數(shù),為了實(shí)現(xiàn)高效性,才引入C RT值。 R SAPublicKeySpe。此類實(shí)現(xiàn)K eySpec界
44、面并規(guī)定R SA公鑰。它提供下列方法,其返回值為組成R SA公鑰的模數(shù)n和公有指數(shù)e。public BigInteger getModulus()public BigInteger getPublicExponent() E n c o d e d K e y S p e c。此類實(shí)現(xiàn)K e y S p e c界面并以編碼格式規(guī)定公鑰或私鑰。E ncodedKeySpec類中的g etEncoded、g etFormat方法分別返回編碼密鑰和編碼格式名。public abstract byte getEncoded();public abstract String getFormat(); P
45、 KCS8EncodedKeySpec。此類是E ncodedKeySpec類的子類,表示符合P KCS#8標(biāo)準(zhǔn)規(guī)定格式的私鑰的D ER編碼。g etEncoded方法返回符合P KCS#8標(biāo)準(zhǔn)經(jīng)過編碼的密鑰字節(jié),g etFormat方法返回字符串P KCS#8。X 509EncodedKeySpec類是E ncodedKeySpec類的子類,表示符合X .509標(biāo)準(zhǔn)規(guī)定格式的私鑰或公鑰的D ER編碼。g etEncoded返回符合X .509標(biāo)準(zhǔn)經(jīng)過編碼的密鑰字節(jié),g etFormat方法返回字符串X .509。本節(jié)回顧生成密鑰和證書的工廠類。1. KeyFactoryK eyFactory
46、類是一種(基本密鑰材料的清晰表示)模糊密鑰( Key類型)和密鑰說明轉(zhuǎn)換的服務(wù)類。密鑰工廠是雙向的,也就是說,可以從給定的密鑰材料建立模糊K ey對(duì)象,也可以從K ey對(duì)象獲知密鑰材料。對(duì)同一個(gè)密鑰可能有多個(gè)兼容的密鑰說明。例如,D SA公鑰可由y、p、q和g說明,也可根據(jù)X .509標(biāo)準(zhǔn)由D ER編碼說明。密鑰工廠可實(shí)現(xiàn)兼容的密鑰說明間的相互轉(zhuǎn)換,即密鑰分析。例如,將X 509EncodedKeySpec轉(zhuǎn)換為D SAPublicKeySpec,表示將已編碼密鑰分析為部件。通過調(diào)用K e y F a c t o r y類中的g e t I n s t a n c e靜態(tài)工廠方法可以獲得特定類
47、型密鑰算法的K eyFacrory對(duì)象。public static KeyFactory getInstance(String algorithm)public static KeyFactory getInstance(String algorithm,String provider)調(diào)用者通過指定提供器的名稱,可保證密鑰工廠的實(shí)現(xiàn)來自K eyFactory的命名提供器。在給定私鑰或公鑰的密鑰說明中,調(diào)用g eneratePublic或g eneratePrivate方法,可以分別獲得模糊P ublicKey或P rivateKey對(duì)象。public PublicKey generatePu
48、blic(KeySpec Keyspec)public PrivateKey generatePrivate(KeySpec Keyspec)相反地,對(duì)于給定K ey對(duì)象,調(diào)用g etKeySpec方法可以獲得相應(yīng)的K eySpec對(duì)象。public KeySpec getKeySpec(Key key, Class KeySpec)K eySpec確定返回的密鑰材料的說明類。例如,如果K eySpec是D SAPublicKeySpec.class,就說明密鑰材料將以D SAPublicKeySpec類的實(shí)例形式返回。2. CertificateFactoryC ertificateFact
49、ory類是一個(gè)定義證書工廠功能的服務(wù)類。它可以用來從編碼中產(chǎn)生證書和C RL對(duì)象。X .509證書的證書工廠的返回值是證書或C RL對(duì)象,它們分別是j ava.security. cert.X 509Certificate和j ava.security. cert.X509CRL的實(shí)例。 對(duì)于證書或C RL類型,為了獲得一個(gè)C ertificateFactory對(duì)象,可在C ertificateFactory類中調(diào)用g etInstance靜態(tài)工廠方法:public static CertificateFactory getInstance(String type) 為了指定一個(gè)提供器,可使用
50、g etInstance方法:public static CertificateFactory getInstance(String type,String provider)為了產(chǎn)生證書對(duì)象并且用從一個(gè)輸入流中讀取的數(shù)據(jù)對(duì)它初始化,可使用C ertificate方法:public final Certificate generateCertificate(InputStream is)g e n e r a t e 為了返回一個(gè)從給定輸入流中讀取的證書的集合(可能為空),可使用g enerateCertificates方法:public final Collection generateCe
51、rtificates(InputStream is) 為了產(chǎn)生一個(gè)C RL對(duì)象并且用從輸入流中讀取數(shù)據(jù)對(duì)它初始化,可使用g enerateCRL方法:public final CRL generateCRL(InputStream is) 為了返回一個(gè)從給定輸入流中讀取的C RL集合(可能為空),可使用g enerateCRLs方法。public final Collection generateCRLs(InputStream is)7.3.8 KeyPair和KeyPairGeneratorK eyPair類是一個(gè)密鑰對(duì)(一個(gè)公鑰和一個(gè)私鑰)的持有者。它有兩個(gè)公用的方法,分別用來返回公鑰和
52、私鑰:public PrivateKey getPrivate()public PublicKey getPublic()K eyPairGenerator類是一個(gè)用來產(chǎn)生公私鑰對(duì)的服務(wù)類。產(chǎn)生過程可以是算法無關(guān)方式的,也可以有指定算法方法的,這取決于對(duì)象如何初始化。所有的密鑰對(duì)產(chǎn)生都開始于一個(gè)K eyPairGenerator。這是一個(gè)有特定算法的密鑰對(duì)產(chǎn)生器,它可以使用該算法創(chuàng)建一個(gè)公鑰私鑰對(duì),該生成器也把指定算法的參數(shù)與每一個(gè)生成的公鑰私鑰對(duì)相關(guān)聯(lián)。可使用下列工廠方法之一來創(chuàng)建一個(gè)K eyPairGenerator:public static KeyPairGenerator getIn
53、stance(String algorithm),String provider)public static KeyPairGenerator getInstance(String algorithm密鑰產(chǎn)生成器在生成密鑰之前需要進(jìn)行初始化。在多數(shù)情況下,算法無關(guān)方式的初始化就已經(jīng)足夠了。所有的密鑰對(duì)產(chǎn)生器都包括兩個(gè)概念:隨機(jī)源和密鑰大小。密鑰大小對(duì)不同的算法有不同的解釋。例如,在D SA算法中,大小指的是模數(shù)的長度。i nitialize方法使用這兩個(gè)廣泛應(yīng)用的參數(shù)類型,而另一種i nitialize方法由于使用系統(tǒng)提供的隨機(jī)源,所以只使用一個(gè)密鑰大小參數(shù)。public void initi
54、alize(int keysize)public void initialize(int keysize,SecureRandom random)既然當(dāng)調(diào)用上面的算法無關(guān)的i nitialize方法時(shí),沒有指明其他的參數(shù),那么提供器就必須確定與每一個(gè)密鑰相關(guān)的指定算法參數(shù)。例如,如果算法是D SA且模數(shù)大小(密鑰大小)是5 12、7 68或1 024,那么S UN提供器為p、q和g參數(shù)提供一組預(yù)先計(jì)算好的參數(shù)。如果模數(shù)大小不包含在這些值之中,S UN提供器就創(chuàng)建一組新的參數(shù)。其他的提供器有可能預(yù)先計(jì)算好多組參數(shù),而不僅僅是這里提到的三個(gè)模數(shù)大小。其他的提供器也有可能根本就沒有預(yù)先計(jì)算好的參數(shù)列
55、表,而是每次創(chuàng)建新的參數(shù)組。在某些情況下,需要一個(gè)指定算法的初始化,例如,當(dāng)存在一組指定算法參數(shù)時(shí)中之一在它的隨機(jī)源由系統(tǒng)提供的情況下,不使用S ecureRandom參數(shù)。public void initialize(AlgorithmParameterSpec params),SecureRandom random)public void initialize(AlgorithmParameterSpec params(例如D SA中所謂的“公用”參數(shù))。兩個(gè)i nitialize方法使用了一個(gè)A lgorithmParameterSpec參數(shù)。其為了產(chǎn)生一個(gè)密鑰對(duì),從K eyPairGe
56、nerator中調(diào)用下列方法:public KeyPair generateKeyPair()多次調(diào)用g enerateKeyPair可產(chǎn)生不同的密鑰對(duì)。K eyStore類定義了訪問和修改密鑰庫中信息的界面。第4章講述用來管理密鑰和證書的密鑰庫,并且通過使用k eytool來演示密鑰庫的用途。本節(jié)討論K eyStore的A PI設(shè)計(jì)和實(shí)現(xiàn)。K eyStore由k eytool、j arsigner和p olicytool使用。當(dāng)它處理策略文件時(shí),也可由缺省的P olicy實(shí)現(xiàn)來使用。J DK用戶可以寫出附加的、使用或擴(kuò)展K eyStore的安全應(yīng)用程序。多種不同的實(shí)現(xiàn)都是有可能的,每一個(gè)實(shí)現(xiàn)
57、針對(duì)一個(gè)特殊的密鑰庫類型。例如,一個(gè)實(shí)現(xiàn)可能提供連續(xù)的密鑰庫,而另一個(gè)實(shí)現(xiàn)可以使用智能卡。因此不同類型的密鑰庫實(shí)現(xiàn)并不意味著互相兼容。K eyStore實(shí)現(xiàn)基于提供器。相應(yīng)的抽象K eystoreSpi類指明了S PI界面。P rovider類通常是K eystoreSpi的子類。J DK包含一個(gè)缺省的密鑰庫實(shí)現(xiàn),這個(gè)實(shí)現(xiàn)屬于一個(gè)名為J KS的專有密鑰庫類型(格式)。K eyStore表示內(nèi)存中的一個(gè)密鑰和證書的集合,并且管理兩種類型的輸入項(xiàng):密鑰輸入項(xiàng)和可信證書輸入項(xiàng)。為了創(chuàng)建一個(gè)K eyStore對(duì)象,調(diào)用K eyStore類中的g etInstance靜態(tài)工廠方法,并且可指定提供器名:public static KeyStore getInstance(String type)public static KeyStore getInstance(String type,String provider)在使用一個(gè)K eyStore對(duì)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 租房合租房合同范本04
- 項(xiàng)目委托合同
- 合作社向個(gè)人借款合同范本
- 煙霧探測(cè)器與噴淋系統(tǒng)
- 滅火器材的創(chuàng)新與發(fā)展趨勢(shì)
- 半年工作總結(jié)報(bào)告范文11篇
- 生態(tài)產(chǎn)品價(jià)值實(shí)現(xiàn)的研究熱點(diǎn)與展望
- 嬰幼兒、成人和老年皮膚結(jié)構(gòu)特點(diǎn)研究進(jìn)展
- 基于情感認(rèn)知理論的智能教育裝備CMF設(shè)計(jì)探析
- 密集雜波環(huán)境紅外目標(biāo)檢測(cè)關(guān)鍵技術(shù)研究
- 公眾聚集場(chǎng)所消防技術(shù)標(biāo)準(zhǔn)要點(diǎn)
- 幼兒園員工手冊(cè)與規(guī)章制度
- 社團(tuán)活動(dòng)經(jīng)費(fèi)預(yù)算申請(qǐng)表
- 經(jīng)營范圍登記規(guī)范表述目錄(試行)(V1.0.2版)
- 2023年山東省威海市中考物理真題(附答案詳解)
- 第八講 發(fā)展全過程人民民主PPT習(xí)概論2023優(yōu)化版教學(xué)課件
- 王崧舟:學(xué)習(xí)任務(wù)群與課堂教學(xué)變革 2022版新課程標(biāo)準(zhǔn)解讀解析資料 57
- 招投標(biāo)現(xiàn)場(chǎng)項(xiàng)目經(jīng)理答辯(完整版)資料
- 運(yùn)動(dòng)競(jìng)賽學(xué)課件
- 2022年上海市初中畢業(yè)數(shù)學(xué)課程終結(jié)性評(píng)價(jià)指南
- 高考作文備考-議論文對(duì)比論證 課件14張
評(píng)論
0/150
提交評(píng)論