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类详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot集成Camunda使用Mysql介绍

    Springboot集成Camunda使用Mysql介绍

    大家好,本篇文章主要讲的是Springboot集成Camunda使用Mysql介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12
  • Java SpringMVC拦截器与异常处理机制详解分析

    Java SpringMVC拦截器与异常处理机制详解分析

    SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化我们日常Web开发
    2021-10-10
  • springmvc分层领域模型概念详解

    springmvc分层领域模型概念详解

    本文核心为分层领域模型(VO , PO , BO, DAO ,POJO等)概念的个人理解,结合springmvc浅谈分层领域模型的相关知识,感兴趣的朋友跟随小编一起看看吧
    2021-08-08
  • Java中判断对象是否相等的equals()方法使用教程

    Java中判断对象是否相等的equals()方法使用教程

    与==运算符响应,equals()方法也是Java中对对象进行比较的一大方式,要特别注意二者的不同点,这个我们在下文中即将讲到,接下来我们就来看一下Java中判断对象是否相等的equals()方法使用教程
    2016-05-05
  • Spring事务管理下synchronized锁失效问题的解决方法

    Spring事务管理下synchronized锁失效问题的解决方法

    这篇文章主要给大家介绍了关于Spring事务管理下synchronized锁失效问题的解决方法,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • java实现把字符串首字母变为大写的方法

    java实现把字符串首字母变为大写的方法

    在Java中,如果你想将字符串的首字母变为大写,可以使用String类提供的substring和toUpperCase方法结合使用,或者使用Character类的toUpperCase方法,下面给大家介绍java实现把字符串首字母变为大写的方法,感兴趣的朋友一起看看吧
    2025-04-04
  • java NIO实现简单聊天程序

    java NIO实现简单聊天程序

    这篇文章主要为大家详细介绍了java NIO实现简单聊天程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-11-11
  • 基于SpringMVC拦截器实现接口耗时监控功能

    基于SpringMVC拦截器实现接口耗时监控功能

    本文呢主要介绍了基于SpringMVC拦截器实现的接口耗时监控功能,统计接口的耗时情况属于一个可以复用的功能点,因此这里直接使用 SpringMVC的HandlerInterceptor拦截器来实现,需要的朋友可以参考下
    2024-02-02
  • springMVC如何将controller中Model数据传递到jsp页面

    springMVC如何将controller中Model数据传递到jsp页面

    本篇文章主要介绍了springMVC如何将controller中Model数据传递到jsp页面,具有一定的参考价值,有兴趣的可以了解一下
    2017-07-07
  • 关于@GetMapping和@GetMapping(value=““)的区别

    关于@GetMapping和@GetMapping(value=““)的区别

    这篇文章主要介绍了关于@GetMapping和@GetMapping(value=““)的区别说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-05-05

最新评论