Java中的SecretKeyFactory類使用詳解
一、簡述
SecretKeyFactory表示私密密鑰的工廠。
密鑰工廠用來將密鑰(類型 Key 的不透明加密密鑰)轉(zhuǎn)換為密鑰規(guī)范(底層密鑰材料的透明表示形式)
反之亦然。秘密密鑰工廠只對秘密(對稱)密鑰進(jìn)行操作。
密鑰工廠為雙工模式,即其允許根據(jù)給定密鑰規(guī)范(密鑰材料)構(gòu)建不透明密鑰對象,或以適當(dāng)格式獲取密鑰對象的底層密鑰材料。
應(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 對象
2、此方法從首選 Provider 開始遍歷已注冊安全提供者列表。返回一個封裝 SecretKeyFactorySpi 實現(xiàn)的新 SecretKeyFactory 對象,該實現(xiàn)取自支持指定算法的第一個 Provider。
注意:可以通過 Security.getProviders() 方法獲取已注冊提供者列表。
2.3 algorithm參數(shù)
algorithm - 所請求的秘密密鑰算法的標(biāo)準(zhǔn)名稱。有關(guān)標(biāo)準(zhǔn)算法名稱的信息,請參閱 Java Cryptography Architecture Reference Guide中的附錄 A
拋出:NoSuchAlgorithmException - 如果沒有任何 Provider 支持指定算法的 SecretKeyFactorySpi 實現(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 對象。
返回一個封裝 SecretKeyFactorySpi 實現(xiàn)的新 SecretKeyFactory 對象,該實現(xiàn)取自指定的提供者。指定提供者必須在安全提供者列表中注冊。
拋出異常
- NoSuchAlgorithmException - 如果不能從指定提供者獲得指定算法的 SecretKeyFactorySpi 實現(xiàn)。
- NullPointerException - 如果指定的算法為 null。
- NoSuchProviderException - 如果指定提供者未在安全提供者列表中注冊。
- 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);
}返回一個封裝 SecretKeyFactorySpi 實現(xiàn)的新 SecretKeyFactory 對象,該實現(xiàn)取自指定的 Provider 對象。注意,指定 Provider 對象無需在提供者列表中注冊。
拋出異常
- NullPointerException - 如果指定的算法為 null。
- NoSuchAlgorithmException - 如果不能從指定的 Provider 對象獲得指定算法的 SecretKeyFactorySpi 實現(xiàn)。
- IllegalArgumentException - 如果 provider 為 null。
2.6 getProvider方法
返回此 SecretKeyFactory 對象的提供者。
public final Provider getProvider() {
synchronized(this.lock) {
this.serviceIterator = null;
return this.provider;
}
}2.7 getAlgorithm方法
返回此 SecretKeyFactory 對象的算法名稱。 此名稱與在某個創(chuàng)建此 SecretKeyFactory 對象的 getInstance 調(diào)用中指定的名稱相同。
public final String getAlgorithm() {
return this.algorithm;
}2.8 generateSecret方法
根據(jù)提供的密鑰規(guī)范(密鑰材料)生成 SecretKey 對象。
返回:秘密密鑰
拋出: 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方法
以請求的格式返回給定密鑰對象的規(guī)范(密鑰材料)。
返回:所請求格式的底層密鑰規(guī)范(密鑰材料)
拋出:InvalidKeySpecException - 如果所請求的密鑰規(guī)范不適合給定的密鑰(例如,與 key 和 keySpec 關(guān)聯(lián)的算法不匹配,或者 key 在加密硬件設(shè)備上引用一個密鑰而 keySpec 是基于軟件的密鑰規(guī)范),或者無法處理給定的密鑰(例如,給定的密鑰具有此秘密密鑰工廠不支持的算法或格式)。
/*key - 密鑰
*keySpec - 所請求的格式,密鑰材料將以此格式返回
*/
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方法
將一個密鑰對象(其提供者未知或可能不受信任)轉(zhuǎn)換為此秘密密鑰工廠的相應(yīng)密鑰對象。
返回:已轉(zhuǎn)換的密鑰
拋出:InvalidKeyException - 如果此秘密密鑰工廠無法處理給定的密鑰。
/*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 {
// 獲取密鑰工廠類對象
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
byte[] DESkey = "abcdefghijk".getBytes("UTF-8");// 設(shè)置密鑰
DESKeySpec keySpec = new DESKeySpec(DESkey);// 設(shè)置密鑰參數(shù)
Key key = keyFactory.generateSecret(keySpec);// 得到密鑰對象
} catch (Exception e) {
e.printStackTrace();
}到此這篇關(guān)于Java中的SecretKeyFactory類使用詳解的文章就介紹到這了,更多相關(guān)SecretKeyFactory類詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java SpringMVC攔截器與異常處理機(jī)制詳解分析
SpringMVC是一種基于Java,實現(xiàn)了Web MVC設(shè)計模式,請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將Web層進(jìn)行職責(zé)解耦?;谡埱篁?qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),SpringMVC也是要簡化我們?nèi)粘eb開發(fā)2021-10-10
Spring事務(wù)管理下synchronized鎖失效問題的解決方法
這篇文章主要給大家介紹了關(guān)于Spring事務(wù)管理下synchronized鎖失效問題的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-03-03
基于SpringMVC攔截器實現(xiàn)接口耗時監(jiān)控功能
springMVC如何將controller中Model數(shù)據(jù)傳遞到j(luò)sp頁面
關(guān)于@GetMapping和@GetMapping(value=““)的區(qū)別

