Java中的SecretKeyFactory類使用詳解
一、簡(jiǎn)述
SecretKeyFactory表示私密密鑰的工廠。
密鑰工廠用來(lái)將密鑰(類型 Key 的不透明加密密鑰)轉(zhuǎn)換為密鑰規(guī)范(底層密鑰材料的透明表示形式)
反之亦然。秘密密鑰工廠只對(duì)秘密(對(duì)稱)密鑰進(jìn)行操作。
密鑰工廠為雙工模式,即其允許根據(jù)給定密鑰規(guī)范(密鑰材料)構(gòu)建不透明密鑰對(duì)象,或以適當(dāng)格式獲取密鑰對(duì)象的底層密鑰材料。
應(yīng)用程序開發(fā)人員應(yīng)參閱其提供者文檔,找出 generateSecret和 getKeySpec方法所支持的密鑰規(guī)范。例如,"SunJCE" 提供者提供的 DES 秘密密鑰工廠支持 DESKeySpec 作為 DES 密鑰的透明表示形式,并且該提供者的 Triple DES 密鑰的秘密密鑰工廠支持 DESedeKeySpec 作為 Triple DES 密鑰的透明表示形式。
二、源碼
2.1 構(gòu)造方法
/** var1 委托 * var2 提供者 * var3 密匙算法 */ protected SecretKeyFactory(SecretKeyFactorySpi var1, Provider var2, String var3) { this.spi = var1; this.provider = var2; this.algorithm = var3; } /** var1 密匙算法 */ private SecretKeyFactory(String var1) throws NoSuchAlgorithmException { this.algorithm = var1; List var2 = GetInstance.getServices("SecretKeyFactory", var1); this.serviceIterator = var2.iterator(); if (this.nextSpi((SecretKeyFactorySpi)null) == null) { throw new NoSuchAlgorithmException(var1 + " SecretKeyFactory not available"); } }
2.2 getInstance方法一詳解
public static final SecretKeyFactory getInstance(String var0) throws NoSuchAlgorithmException { return new SecretKeyFactory(var0); }
1、調(diào)用私有的SecretKeyFactory構(gòu)造方法,返回轉(zhuǎn)換指定算法的秘密密鑰的 SecretKeyFactory 對(duì)象
2、此方法從首選 Provider 開始遍歷已注冊(cè)安全提供者列表。返回一個(gè)封裝 SecretKeyFactorySpi 實(shí)現(xiàn)的新 SecretKeyFactory 對(duì)象,該實(shí)現(xiàn)取自支持指定算法的第一個(gè) Provider。
注意:可以通過(guò) Security.getProviders() 方法獲取已注冊(cè)提供者列表。
2.3 algorithm參數(shù)
algorithm - 所請(qǐng)求的秘密密鑰算法的標(biāo)準(zhǔn)名稱。有關(guān)標(biāo)準(zhǔn)算法名稱的信息,請(qǐng)參閱 Java Cryptography Architecture Reference Guide中的附錄 A
拋出:NoSuchAlgorithmException - 如果沒(méi)有任何 Provider 支持指定算法的 SecretKeyFactorySpi 實(shí)現(xiàn)。
2.4 getInstance方法二
/** var0 密匙算法 * var1 提供者 */ public static final SecretKeyFactory getInstance(String var0, String var1) throws NoSuchAlgorithmException, NoSuchProviderException { Instance var2 = JceSecurity.getInstance("SecretKeyFactory", SecretKeyFactorySpi.class, var0, var1); return new SecretKeyFactory((SecretKeyFactorySpi)var2.impl, var2.provider, var0); }
返回轉(zhuǎn)換指定算法的秘密密鑰的 SecretKeyFactory 對(duì)象。
返回一個(gè)封裝 SecretKeyFactorySpi 實(shí)現(xiàn)的新 SecretKeyFactory 對(duì)象,該實(shí)現(xiàn)取自指定的提供者。指定提供者必須在安全提供者列表中注冊(cè)。
拋出異常
- NoSuchAlgorithmException - 如果不能從指定提供者獲得指定算法的 SecretKeyFactorySpi 實(shí)現(xiàn)。
- NullPointerException - 如果指定的算法為 null。
- NoSuchProviderException - 如果指定提供者未在安全提供者列表中注冊(cè)。
- IllegalArgumentException - 如果 provider 為 null 或空。
2.5 getInstance方法三詳解
/** var0 密匙算法 * var1 提供者 */ public static final SecretKeyFactory getInstance(String var0, Provider var1) throws NoSuchAlgorithmException { Instance var2 = JceSecurity.getInstance("SecretKeyFactory", SecretKeyFactorySpi.class, var0, var1); return new SecretKeyFactory((SecretKeyFactorySpi)var2.impl, var2.provider, var0); }
返回一個(gè)封裝 SecretKeyFactorySpi 實(shí)現(xiàn)的新 SecretKeyFactory 對(duì)象,該實(shí)現(xiàn)取自指定的 Provider 對(duì)象。注意,指定 Provider 對(duì)象無(wú)需在提供者列表中注冊(cè)。
拋出異常
- NullPointerException - 如果指定的算法為 null。
- NoSuchAlgorithmException - 如果不能從指定的 Provider 對(duì)象獲得指定算法的 SecretKeyFactorySpi 實(shí)現(xiàn)。
- IllegalArgumentException - 如果 provider 為 null。
2.6 getProvider方法
返回此 SecretKeyFactory 對(duì)象的提供者。
public final Provider getProvider() { synchronized(this.lock) { this.serviceIterator = null; return this.provider; } }
2.7 getAlgorithm方法
返回此 SecretKeyFactory 對(duì)象的算法名稱。 此名稱與在某個(gè)創(chuàng)建此 SecretKeyFactory 對(duì)象的 getInstance 調(diào)用中指定的名稱相同。
public final String getAlgorithm() { return this.algorithm; }
2.8 generateSecret方法
根據(jù)提供的密鑰規(guī)范(密鑰材料)生成 SecretKey 對(duì)象。
返回:秘密密鑰
拋出: InvalidKeySpecException - 如果給定密鑰規(guī)范不適合生成秘密密鑰的秘密密鑰工廠。
/*keySpec - 秘密密鑰的規(guī)范(密鑰材料) **/ public final SecretKey generateSecret(KeySpec var1) throws InvalidKeySpecException { if (this.serviceIterator == null) { return this.spi.engineGenerateSecret(var1); } else { Exception var2 = null; SecretKeyFactorySpi var3 = this.spi; while(true) { try { return var3.engineGenerateSecret(var1); } catch (Exception var5) { if (var2 == null) { var2 = var5; } var3 = this.nextSpi(var3); if (var3 == null) { if (var2 instanceof InvalidKeySpecException) { throw (InvalidKeySpecException)var2; } throw new InvalidKeySpecException("Could not generate secret key", var2); } } } } }
2.9 getKeySpec方法
以請(qǐng)求的格式返回給定密鑰對(duì)象的規(guī)范(密鑰材料)。
返回:所請(qǐng)求格式的底層密鑰規(guī)范(密鑰材料)
拋出:InvalidKeySpecException - 如果所請(qǐng)求的密鑰規(guī)范不適合給定的密鑰(例如,與 key 和 keySpec 關(guān)聯(lián)的算法不匹配,或者 key 在加密硬件設(shè)備上引用一個(gè)密鑰而 keySpec 是基于軟件的密鑰規(guī)范),或者無(wú)法處理給定的密鑰(例如,給定的密鑰具有此秘密密鑰工廠不支持的算法或格式)。
/*key - 密鑰 *keySpec - 所請(qǐng)求的格式,密鑰材料將以此格式返回 */ public final KeySpec getKeySpec(SecretKey var1, Class<?> var2) throws InvalidKeySpecException { if (this.serviceIterator == null) { return this.spi.engineGetKeySpec(var1, var2); } else { Exception var3 = null; SecretKeyFactorySpi var4 = this.spi; while(true) { try { return var4.engineGetKeySpec(var1, var2); } catch (Exception var6) { if (var3 == null) { var3 = var6; } var4 = this.nextSpi(var4); if (var4 == null) { if (var3 instanceof InvalidKeySpecException) { throw (InvalidKeySpecException)var3; } throw new InvalidKeySpecException("Could not get key spec", var3); } } } } }
2.10 translateKey方法
將一個(gè)密鑰對(duì)象(其提供者未知或可能不受信任)轉(zhuǎn)換為此秘密密鑰工廠的相應(yīng)密鑰對(duì)象。
返回:已轉(zhuǎn)換的密鑰
拋出:InvalidKeyException - 如果此秘密密鑰工廠無(wú)法處理給定的密鑰。
/*key - 其提供者未知或不受信任的密鑰 */ public final SecretKey translateKey(SecretKey var1) throws InvalidKeyException { if (this.serviceIterator == null) { return this.spi.engineTranslateKey(var1); } else { Exception var2 = null; SecretKeyFactorySpi var3 = this.spi; while(true) { try { return var3.engineTranslateKey(var1); } catch (Exception var5) { if (var2 == null) { var2 = var5; } var3 = this.nextSpi(var3); if (var3 == null) { if (var2 instanceof InvalidKeyException) { throw (InvalidKeyException)var2; } throw new InvalidKeyException("Could not translate key", var2); } } } } }
例如下面例子
try { // 獲取密鑰工廠類對(duì)象 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); byte[] DESkey = "abcdefghijk".getBytes("UTF-8");// 設(shè)置密鑰 DESKeySpec keySpec = new DESKeySpec(DESkey);// 設(shè)置密鑰參數(shù) Key key = keyFactory.generateSecret(keySpec);// 得到密鑰對(duì)象 } catch (Exception e) { e.printStackTrace(); }
到此這篇關(guān)于Java中的SecretKeyFactory類使用詳解的文章就介紹到這了,更多相關(guān)SecretKeyFactory類詳解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法
排序算法看似簡(jiǎn)單,其實(shí)不同的算法中蘊(yùn)涵著經(jīng)典的算法策略。通過(guò)熟練掌握排序算法,就可以掌握基本的算法設(shè)計(jì)思想,本文主要介紹了Java中的排序算法,需要的朋友歡迎閱讀2023-04-04java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換
很多人表示,java將string類型轉(zhuǎn)為date類型不知道應(yīng)該怎樣做,本文就來(lái)介紹一下java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10使用BitSet位集合,一個(gè)重復(fù)校驗(yàn)工具
這篇文章主要介紹了使用BitSet位集合,一個(gè)重復(fù)校驗(yàn)工具,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10淺談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時(shí)、持久、游離)
下面小編就為大家?guī)?lái)一篇淺談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時(shí)、持久、游離)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09SpringBoot 靜態(tài)資源導(dǎo)入及首頁(yè)設(shè)置問(wèn)題
本節(jié)了解一下 SpringBoot 中 Web 開發(fā)的靜態(tài)資源導(dǎo)入和首頁(yè)設(shè)置,對(duì)應(yīng) SpringBoot-03-Web 項(xiàng)目,本節(jié)主要是從源碼的角度,研究了一下靜態(tài)資源導(dǎo)入和首頁(yè)設(shè)置的問(wèn)題2021-09-09java遠(yuǎn)程調(diào)用接口、URL的方式代碼
我們都知道接口有自己本地的,也有遠(yuǎn)程別人寫好的,而調(diào)用遠(yuǎn)程接口的就需要使用遠(yuǎn)程調(diào)用啦,這篇文章主要給大家介紹了關(guān)于java遠(yuǎn)程調(diào)用接口、URL的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-11-11