Java中的SecretKeyFactory类使用详解
作者:java-zh
一、简述
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类详解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!