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
算法:
DiffieHellman
DSA
RSA
- 自版本:
- 1.2
- 参见:
-
Constructor Summary
ModifierConstructorDescriptionprotected
KeyFactory
(KeyFactorySpi keyFacSpi, Provider provider, String algorithm) 创建一个KeyFactory
对象。 -
Method Summary
Modifier and TypeMethodDescriptionfinal PrivateKey
generatePrivate
(KeySpec keySpec) 从提供的密钥规范(密钥材料)生成私钥对象。final PublicKey
generatePublic
(KeySpec keySpec) 从提供的密钥规范(密钥材料)生成公钥对象。final String
获取与此KeyFactory
关联的算法的名称。static KeyFactory
getInstance
(String algorithm) 返回一个KeyFactory
对象,用于转换指定算法的公钥/私钥。static KeyFactory
getInstance
(String algorithm, String provider) 返回一个KeyFactory
对象,用于转换指定算法的公钥/私钥。static KeyFactory
getInstance
(String algorithm, Provider provider) 返回一个KeyFactory
对象,用于转换指定算法的公钥/私钥。final <T extends KeySpec>
TgetKeySpec
(Key key, Class<T> keySpec) 返回给定密钥对象的规范(密钥材料)。final Provider
返回此密钥工厂对象的提供程序。final Key
translateKey
(Key key) 将一个密钥对象(其提供程序可能未知或潜在不受信任)转换为此密钥工厂的相应密钥对象。
-
Constructor Details
-
KeyFactory
创建一个KeyFactory
对象。- 参数:
-
keyFacSpi
- 代理 -
provider
- 提供程序 -
algorithm
- 与此KeyFactory
关联的算法的名称
-
-
Method Details
-
getInstance
返回一个KeyFactory
对象,用于转换指定算法的公钥/私钥。此方法遍历已注册的安全提供程序列表,从最首选的提供程序开始。返回一个封装了支持指定算法的第一个提供程序的
KeyFactorySpi
实现的新KeyFactory
对象。请注意,已注册提供程序的列表可以通过
Security.getProviders()
方法检索。- 实现注意:
-
JDK参考实现还使用
jdk.security.provider.preferred
Security
属性来确定指定算法的首选提供程序顺序。这可能与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
- 如果此密钥工厂无法处理给定的密钥。
-