欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的SecretKeyFactory類使用詳解

 更新時(shí)間:2024年01月17日 10:30:03   作者:java-zh  
這篇文章主要介紹了Java中的SecretKeyFactory類使用詳解,SecretKeyFactory表示私密密鑰的工廠,密鑰工廠用來(lái)將密鑰(類型 Key 的不透明加密密鑰)轉(zhuǎn)換為密鑰規(guī)范(底層密鑰材料的透明表示形式),需要的朋友可以參考下

一、簡(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)文章

  • Java中隨機(jī)函數(shù)變換的示例詳解

    Java中隨機(jī)函數(shù)變換的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Java中隨機(jī)函數(shù)的變換,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定的幫助,感興趣的可以了解一下
    2022-08-08
  • Java 構(gòu)造方法的使用詳解

    Java 構(gòu)造方法的使用詳解

    構(gòu)造方法是類的一種特殊方法,用來(lái)初始化類的一個(gè)新的對(duì)象,在創(chuàng)建對(duì)象(new 運(yùn)算符)之后自動(dòng)調(diào)用。Java 中的每個(gè)類都有一個(gè)默認(rèn)的構(gòu)造方法,并且可以有一個(gè)以上的構(gòu)造方法
    2021-11-11
  • java將excel轉(zhuǎn)為pdf的方法步驟

    java將excel轉(zhuǎn)為pdf的方法步驟

    之前工作需要,查了挺多種Excel轉(zhuǎn)PDF的方法,下面這篇文章主要給大家介紹了關(guān)于java將excel轉(zhuǎn)為pdf的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法

    數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法

    排序算法看似簡(jiǎn)單,其實(shí)不同的算法中蘊(yùn)涵著經(jīng)典的算法策略。通過(guò)熟練掌握排序算法,就可以掌握基本的算法設(shè)計(jì)思想,本文主要介紹了Java中的排序算法,需要的朋友歡迎閱讀
    2023-04-04
  • java實(shí)現(xiàn)String類型和Date類型相互轉(zhuǎn)換

    java實(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)工具

    這篇文章主要介紹了使用BitSet位集合,一個(gè)重復(fù)校驗(yàn)工具,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • 淺談Hibernate中的三種數(shù)據(jù)狀態(tài)(臨時(shí)、持久、游離)

    淺談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-09
  • SpringBoot 靜態(tài)資源導(dǎo)入及首頁(yè)設(shè)置問(wèn)題

    SpringBoot 靜態(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-09
  • 淺談springBean的作用域

    淺談springBean的作用域

    本文主要介紹了淺談springBean的作用域,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • java遠(yuǎn)程調(diào)用接口、URL的方式代碼

    java遠(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

最新評(píng)論