java.lang.Object
java.security.KeyFactory
密钥工厂用于将密钥(类型为
Key的不透明加密密钥)转换为密钥规范(底层密钥材料的透明表示),反之亦然。
密钥工厂是双向的。也就是说,它们允许您从给定的密钥规范(密钥材料)构建不透明密钥对象,或者以适当格式检索密钥对象的底层密钥材料。
对于同一密钥可能存在多个兼容的密钥规范。例如,DSA公钥可以使用DSAPublicKeySpec或X509EncodedKeySpec来指定。密钥工厂可用于在兼容的密钥规范之间进行转换。
以下是如何使用密钥工厂实例化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算法:
DiffieHellmanDSARSA
- 自版本:
- 1.2
- 参见:
-
Constructor Summary
ConstructorsModifierConstructorDescriptionprotectedKeyFactory(KeyFactorySpi keyFacSpi, Provider provider, String algorithm) 创建一个KeyFactory对象。 -
Method Summary
Modifier and TypeMethodDescriptionfinal PrivateKeygeneratePrivate(KeySpec keySpec) 从提供的密钥规范(密钥材料)生成私钥对象。final PublicKeygeneratePublic(KeySpec keySpec) 从提供的密钥规范(密钥材料)生成公钥对象。final String获取与此KeyFactory关联的算法的名称。static KeyFactorygetInstance(String algorithm) 返回一个KeyFactory对象,用于转换指定算法的公钥/私钥。static KeyFactorygetInstance(String algorithm, String provider) 返回一个KeyFactory对象,用于转换指定算法的公钥/私钥。static KeyFactorygetInstance(String algorithm, Provider provider) 返回一个KeyFactory对象,用于转换指定算法的公钥/私钥。final <T extends KeySpec>
TgetKeySpec(Key key, Class<T> keySpec) 返回给定密钥对象的规范(密钥材料)。final Provider返回此密钥工厂对象的提供程序。final KeytranslateKey(Key key) 将一个密钥对象(其提供程序可能未知或潜在不受信任)转换为此密钥工厂的相应密钥对象。
-
Constructor Details
-
KeyFactory
创建一个KeyFactory对象。- 参数:
-
keyFacSpi- 代理 -
provider- 提供程序 -
algorithm- 与此KeyFactory关联的算法的名称
-
-
Method Details
-
getInstance
返回一个KeyFactory对象,用于转换指定算法的公钥/私钥。此方法遍历已注册的安全提供程序列表,从最首选的提供程序开始。返回一个封装了支持指定算法的第一个提供程序的
KeyFactorySpi实现的新KeyFactory对象。请注意,已注册提供程序的列表可以通过
Security.getProviders()方法检索。- 实现注意:
-
JDK参考实现还使用
jdk.security.provider.preferredSecurity属性来确定指定算法的首选提供程序顺序。这可能与Security.getProviders()返回的提供程序顺序不同。 - 参数:
-
algorithm- 请求的密钥算法的名称。有关标准算法名称的信息,请参阅 Java安全标准算法名称规范中的KeyFactory部分。 - 返回:
-
新的
KeyFactory对象 - 抛出:
-
NoSuchAlgorithmException- 如果没有Provider支持指定算法的KeyFactorySpi实现 -
NullPointerException- 如果algorithm为null - 参见:
-
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- 如果algorithm为null - 参见:
-
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- 如果algorithm为null - 自版本:
- 1.4
- 参见:
-
getProvider
返回此密钥工厂对象的提供程序。- 返回:
- 此密钥工厂对象的提供程序
-
getAlgorithm
获取与此KeyFactory关联的算法的名称。- 返回:
-
与此
KeyFactory关联的算法的名称
-
generatePublic
从提供的密钥规范(密钥材料)生成公钥对象。- 参数:
-
keySpec- 公钥的规范(密钥材料)。 - 返回:
- 公钥。
- 抛出:
-
InvalidKeySpecException- 如果给定的密钥规范不适合此密钥工厂生成公钥。
-
generatePrivate
从提供的密钥规范(密钥材料)生成私钥对象。- 参数:
-
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
将一个密钥对象(其提供者可能未知或潜在不受信任)转换为此密钥工厂的相应密钥对象。- 参数:
-
key- 其提供者未知或不受信任的密钥。 - 返回:
- 转换后的密钥。
- 抛出:
-
InvalidKeyException- 如果此密钥工厂无法处理给定的密钥。
-