Module java.base
Package java.security

Class KeyFactory

java.lang.Object
java.security.KeyFactory

public class KeyFactory extends Object
密钥工厂用于将密钥(类型为Key的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示),反之亦然。

密钥工厂是双向的。也就是说,它们允许您从给定的密钥规范(密钥材料)构建不透明密钥对象,或者以适当格式检索密钥对象的底层密钥材料。

对于同一密钥可能存在多个兼容的密钥规范。例如,DSA公钥可以使用DSAPublicKeySpecX509EncodedKeySpec来指定。密钥工厂可用于在兼容的密钥规范之间进行转换。

以下是如何使用密钥工厂实例化DSA公钥的示例。假设Alice收到了Bob的数字签名。Bob还向她发送了他的公钥(以编码格式)以验证他的签名。然后Alice执行以下操作:

 X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);
 KeyFactory keyFactory = KeyFactory.getInstance("DSA");
 PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);
 Signature sig = Signature.getInstance("DSA");
 sig.initVerify(bobPubKey);
 sig.update(data);
 sig.verify(signature);
 

Java平台的每个实现都必须支持以下标准KeyFactory算法:

  • DiffieHellman
  • DSA
  • RSA
这些算法在Java安全标准算法名称规范的 KeyFactory部分中有描述。请查阅您的实现的发布文档,以查看是否支持其他算法。
自版本:
1.2
参见:
  • Constructor Details

    • KeyFactory

      protected KeyFactory(KeyFactorySpi keyFacSpi, Provider provider, String algorithm)
      创建一个KeyFactory对象。
      参数:
      keyFacSpi - 代理
      provider - 提供程序
      algorithm - 与此KeyFactory关联的算法的名称
  • Method Details

    • getInstance

      public static KeyFactory getInstance(String algorithm) throws NoSuchAlgorithmException
      返回一个KeyFactory对象,用于转换指定算法的公钥/私钥。

      此方法遍历已注册的安全提供程序列表,从最首选的提供程序开始。返回一个封装了支持指定算法的第一个提供程序的KeyFactorySpi实现的新KeyFactory对象。

      请注意,已注册提供程序的列表可以通过Security.getProviders()方法检索。

      实现注意:
      JDK参考实现还使用jdk.security.provider.preferred Security属性来确定指定算法的首选提供程序顺序。这可能与Security.getProviders()返回的提供程序顺序不同。
      参数:
      algorithm - 请求的密钥算法的名称。有关标准算法名称的信息,请参阅 Java安全标准算法名称规范中的KeyFactory部分。
      返回:
      新的KeyFactory对象
      抛出:
      NoSuchAlgorithmException - 如果没有Provider支持指定算法的KeyFactorySpi实现
      NullPointerException - 如果algorithmnull
      参见:
    • getInstance

      public static KeyFactory getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException
      返回一个KeyFactory对象,用于转换指定算法的公钥/私钥。

      返回一个封装了指定提供程序的KeyFactorySpi实现的新KeyFactory对象。指定的提供程序必须在安全提供程序列表中注册。

      请注意,已注册提供程序的列表可以通过Security.getProviders()方法检索。

      参数:
      algorithm - 请求的密钥算法的名称。有关标准算法名称的信息,请参阅 Java安全标准算法名称规范中的KeyFactory部分。
      provider - 提供程序的名称。
      返回:
      新的KeyFactory对象
      抛出:
      IllegalArgumentException - 如果提供程序名称为null或为空
      NoSuchAlgorithmException - 如果指定提供程序中不可用指定算法的KeyFactorySpi实现
      NoSuchProviderException - 如果指定提供程序未在安全提供程序列表中注册
      NullPointerException - 如果algorithmnull
      参见:
    • getInstance

      public static KeyFactory getInstance(String algorithm, Provider provider) throws NoSuchAlgorithmException
      返回一个KeyFactory对象,用于转换指定算法的公钥/私钥。

      返回一个封装了指定提供程序的KeyFactorySpi实现的新KeyFactory对象。请注意,指定的提供程序不必在提供程序列表中注册。

      参数:
      algorithm - 请求的密钥算法的名称。有关标准算法名称的信息,请参阅 Java安全标准算法名称规范中的KeyFactory部分。
      provider - 提供程序。
      返回:
      新的KeyFactory对象
      抛出:
      IllegalArgumentException - 如果指定的提供程序为null
      NoSuchAlgorithmException - 如果指定的Provider对象中不可用指定算法的KeyFactorySpi实现
      NullPointerException - 如果algorithmnull
      自版本:
      1.4
      参见:
    • getProvider

      public final Provider getProvider()
      返回此密钥工厂对象的提供程序。
      返回:
      此密钥工厂对象的提供程序
    • getAlgorithm

      public final String getAlgorithm()
      获取与此KeyFactory关联的算法的名称。
      返回:
      与此KeyFactory关联的算法的名称
    • generatePublic

      public final PublicKey generatePublic(KeySpec keySpec) throws InvalidKeySpecException
      从提供的密钥规范(密钥材料)生成公钥对象。
      参数:
      keySpec - 公钥的规范(密钥材料)。
      返回:
      公钥。
      抛出:
      InvalidKeySpecException - 如果给定的密钥规范不适合此密钥工厂生成公钥。
    • generatePrivate

      public final PrivateKey generatePrivate(KeySpec keySpec) throws InvalidKeySpecException
      从提供的密钥规范(密钥材料)生成私钥对象。
      参数:
      keySpec - 私钥的规范(密钥材料)。
      返回:
      私钥。
      抛出:
      InvalidKeySpecException - 如果给定的密钥规范不适合此密钥工厂生成私钥。
    • getKeySpec

      public final <T extends KeySpec> T getKeySpec(Key key, Class<T> keySpec) throws InvalidKeySpecException
      返回给定密钥对象的规范(密钥材料)。keySpec标识应返回密钥材料的规范类。例如,它可以是DSAPublicKeySpec.class,表示应以DSAPublicKeySpec类的实例返回密钥材料。
      类型参数:
      T - 要返回的密钥规范的类型
      参数:
      key - 密钥。
      keySpec - 应返回密钥材料的规范类。
      返回:
      请求的规范类的实例中的底层密钥规范(密钥材料)。
      抛出:
      InvalidKeySpecException - 如果请求的密钥规范不适用于给定的密钥,或者无法处理给定的密钥(例如,给定的密钥具有无法识别的算法或格式)。
    • translateKey

      public final Key translateKey(Key key) throws InvalidKeyException
      将一个密钥对象(其提供者可能未知或潜在不受信任)转换为此密钥工厂的相应密钥对象。
      参数:
      key - 其提供者未知或不受信任的密钥。
      返回:
      转换后的密钥。
      抛出:
      InvalidKeyException - 如果此密钥工厂无法处理给定的密钥。