KeyFactory
(密钥工厂)用对密钥(Key
类型的不透明密钥)和密钥规范(KeySpec
类型的底层密钥密钥材料的透明表示)进行相互转换;也就是密钥工厂是双向的,可以把Key
转换成KeySpec
,也可以把KeySpec
转换成Key
。另外对于同一个密钥可以存在多个兼容的密钥规范。
SecretKeyFactory
和 KeyFactory
的不同在于:KeyFactory
用于非对称密钥加密时的密钥转换,而 SecretKeyFactory
用于对称密钥加密时的密钥转换。
-
Key
:不透明的底层密钥,用于程序中的各个加密、解密、签名、验签等算法的使用。 -
KeySpec
:底层密钥的透明表示,可用于密钥的存储,交换等。
程序生成的Key
要进行存储和交换,必须要先转换成KeySpec
;而在持久化设备中存储的或在网络中传输的密钥也必须经过KeySpec
才能被转换成Key
最终供应用中的加密、解密、签名、验签等算法使用。
实例化
KeyFactory
没有公开的构造方法,只能使用 getInstance
方法进行实例化。这个方法有多个重载如下:
public static KeyFactory getInstance(String algorithm)
throws NoSuchAlgorithmException;
public static KeyFactory getInstance(String algorithm, Provider provider)
throws NoSuchAlgorithmException;
public static KeyFactory getInstance(String algorithm, String provider)
throws NoSuchAlgorithmException, NoSuchProviderException;
我们最常用的是 public static KeyFactory getInstance(String algorithm)
,此方法需要一个字符串作为参数,用于说明使用哪个密钥算法。
可用方法
generatePrivate
public final PrivateKey generatePrivate(KeySpec keySpec)
throws InvalidKeySpecException
根据给定的KeySpec
对象,生成PrivateKey
(私钥)对象。
generatePublic
public final PublicKey generatePublic(KeySpec keySpec)
throws InvalidKeySpecException
根据给定的KeySpec
对象,PublicKey
(生成公钥)对象。
getKeySpec
public final <T extends KeySpec> T getKeySpec(Key key, Class<T> keySpec)
throws InvalidKeySpecException
参数中给定的Key
是待转换的密钥,而Class<T>
是需要转换成的目标KeySpec
类。
此方法就是要把给定的Key
对象转换成目标KeySpec
类对象。
translateKey
public final Key translateKey(Key key) throws InvalidKeyException
将密钥对象(其提供程序可能是未知的或可能不受信任的)转换为此密钥工厂的相应密钥对象。
支持的算法:
- DiffieHellman
- DSA
- RSA
- EC