Java中的SecretKeyFactory类使用详解

 更新时间:2024年01月17日 10:30:03   作者:java-zh  
这篇文章主要介绍了Java中的SecretKeyFactory类使用详解,SecretKeyFactory表示私密密钥的工厂,密钥工厂用来将密钥(类型 Key 的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示形式),需要的朋友可以参考下

一、简述

SecretKeyFactory表示私密密钥的工厂。

密钥工厂用来将密钥(类型 Key 的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示形式)

反之亦然。秘密密钥工厂只对秘密(对称)密钥进行操作。

密钥工厂为双工模式,即其允许根据给定密钥规范(密钥材料)构建不透明密钥对象,或以适当格式获取密钥对象的底层密钥材料。

应用程序开发人员应参阅其提供者文档,找出 generateSecret和 getKeySpec方法所支持的密钥规范。例如,"SunJCE" 提供者提供的 DES 秘密密钥工厂支持 DESKeySpec 作为 DES 密钥的透明表示形式,并且该提供者的 Triple DES 密钥的秘密密钥工厂支持 DESedeKeySpec 作为 Triple DES 密钥的透明表示形式。

二、源码

2.1 构造方法

 
/** 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、调用私有的SecretKeyFactory构造方法,返回转换指定算法的秘密密钥的 SecretKeyFactory 对象

2、此方法从首选 Provider 开始遍历已注册安全提供者列表。返回一个封装 SecretKeyFactorySpi 实现的新 SecretKeyFactory 对象,该实现取自支持指定算法的第一个 Provider。

注意:可以通过 Security.getProviders() 方法获取已注册提供者列表。

2.3 algorithm参数

algorithm - 所请求的秘密密钥算法的标准名称。有关标准算法名称的信息,请参阅 Java Cryptography Architecture Reference Guide中的附录 A

抛出:NoSuchAlgorithmException - 如果没有任何 Provider 支持指定算法的 SecretKeyFactorySpi 实现。

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);
    }

返回转换指定算法的秘密密钥的 SecretKeyFactory 对象。

返回一个封装 SecretKeyFactorySpi 实现的新 SecretKeyFactory 对象,该实现取自指定的提供者。指定提供者必须在安全提供者列表中注册。

抛出异常

  • NoSuchAlgorithmException - 如果不能从指定提供者获得指定算法的 SecretKeyFactorySpi 实现。
  • 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 实现的新 SecretKeyFactory 对象,该实现取自指定的 Provider 对象。注意,指定 Provider 对象无需在提供者列表中注册。

抛出异常

  • NullPointerException - 如果指定的算法为 null。
  • NoSuchAlgorithmException - 如果不能从指定的 Provider 对象获得指定算法的 SecretKeyFactorySpi 实现。
  • IllegalArgumentException - 如果 provider 为 null。

2.6 getProvider方法

返回此 SecretKeyFactory 对象的提供者。

 public final Provider getProvider() {
        synchronized(this.lock) {
            this.serviceIterator = null;
            return this.provider;
        }
    }

2.7 getAlgorithm方法

返回此 SecretKeyFactory 对象的算法名称。 此名称与在某个创建此 SecretKeyFactory 对象的 getInstance 调用中指定的名称相同。

public final String getAlgorithm() {
        return this.algorithm;
    }

2.8 generateSecret方法

根据提供的密钥规范(密钥材料)生成 SecretKey 对象。

返回:秘密密钥

抛出: InvalidKeySpecException - 如果给定密钥规范不适合生成秘密密钥的秘密密钥工厂。

 
/*keySpec - 秘密密钥的规范(密钥材料)
 **/
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方法

以请求的格式返回给定密钥对象的规范(密钥材料)。

返回:所请求格式的底层密钥规范(密钥材料)

抛出:InvalidKeySpecException - 如果所请求的密钥规范不适合给定的密钥(例如,与 key 和 keySpec 关联的算法不匹配,或者 key 在加密硬件设备上引用一个密钥而 keySpec 是基于软件的密钥规范),或者无法处理给定的密钥(例如,给定的密钥具有此秘密密钥工厂不支持的算法或格式)。

/*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方法

将一个密钥对象(其提供者未知或可能不受信任)转换为此秘密密钥工厂的相应密钥对象。

返回:已转换的密钥

抛出: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");// 设置密钥
            DESKeySpec keySpec = new DESKeySpec(DESkey);// 设置密钥参数
            Key key = keyFactory.generateSecret(keySpec);// 得到密钥对象
        } catch (Exception e) {
            e.printStackTrace();
        }

到此这篇关于Java中的SecretKeyFactory类使用详解的文章就介绍到这了,更多相关SecretKeyFactory类详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中随机函数变换的示例详解

    Java中随机函数变换的示例详解

    这篇文章主要为大家详细介绍了Java中随机函数的变换,文中的示例代码讲解详细,对我们学习Java有一定的帮助,感兴趣的可以了解一下
    2022-08-08
  • Java 构造方法的使用详解

    Java 构造方法的使用详解

    构造方法是类的一种特殊方法,用来初始化类的一个新的对象,在创建对象(new 运算符)之后自动调用。Java 中的每个类都有一个默认的构造方法,并且可以有一个以上的构造方法
    2021-11-11
  • java将excel转为pdf的方法步骤

    java将excel转为pdf的方法步骤

    之前工作需要,查了挺多种Excel转PDF的方法,下面这篇文章主要给大家介绍了关于java将excel转为pdf的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • 数据结构与算法之手撕排序算法

    数据结构与算法之手撕排序算法

    排序算法看似简单,其实不同的算法中蕴涵着经典的算法策略。通过熟练掌握排序算法,就可以掌握基本的算法设计思想,本文主要介绍了Java中的排序算法,需要的朋友欢迎阅读
    2023-04-04
  • java实现String类型和Date类型相互转换

    java实现String类型和Date类型相互转换

    很多人表示,java将string类型转为date类型不知道应该怎样做,本文就来介绍一下java实现String类型和Date类型相互转换,具有一定的参考价值,感兴趣的可以了解一下
    2023-10-10
  • 使用BitSet位集合,一个重复校验工具

    使用BitSet位集合,一个重复校验工具

    这篇文章主要介绍了使用BitSet位集合,一个重复校验工具,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 浅谈Hibernate中的三种数据状态(临时、持久、游离)

    浅谈Hibernate中的三种数据状态(临时、持久、游离)

    下面小编就为大家带来一篇浅谈Hibernate中的三种数据状态(临时、持久、游离)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • SpringBoot 静态资源导入及首页设置问题

    SpringBoot 静态资源导入及首页设置问题

    本节了解一下 SpringBoot 中 Web 开发的静态资源导入和首页设置,对应 SpringBoot-03-Web 项目,本节主要是从源码的角度,研究了一下静态资源导入和首页设置的问题
    2021-09-09
  • 浅谈springBean的作用域

    浅谈springBean的作用域

    本文主要介绍了浅谈springBean的作用域,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • java远程调用接口、URL的方式代码

    java远程调用接口、URL的方式代码

    我们都知道接口有自己本地的,也有远程别人写好的,而调用远程接口的就需要使用远程调用啦,这篇文章主要给大家介绍了关于java远程调用接口、URL的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-11-11

最新评论