JCA 实践记录——KeyFactory

KeyFactory(密钥工厂)用对密钥(Key类型的不透明密钥)和密钥规范(KeySpec类型的底层密钥密钥材料的透明表示)进行相互转换;也就是密钥工厂是双向的,可以把Key转换成KeySpec,也可以把KeySpec转换成Key。另外对于同一个密钥可以存在多个兼容的密钥规范。

SecretKeyFactoryKeyFactory的不同在于:KeyFactory用于非对称密钥加密时的密钥转换,而 SecretKeyFactory 用于对称密钥加密时的密钥转换。

  1. Key:不透明的底层密钥,用于程序中的各个加密、解密、签名、验签等算法的使用。
  2. 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 

将密钥对象(其提供程序可能是未知的或可能不受信任的)转换为此密钥工厂的相应密钥对象。

支持的算法:

  1. DiffieHellman
  2. DSA
  3. RSA
  4. EC
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,148评论 1 32
  • JCA是平台的一个主要部分,包含一个“Provider”体系结构和一组用于数字签名,消息摘要(哈希),证书和证书验...
    jection阅读 5,460评论 1 9
  • 概述 之前一直对加密相关的算法知之甚少,只知道类似DES、RSA等加密算法能对数据传输进行加密,且各种加密算法各有...
    Henryzhu阅读 3,064评论 0 14
  • 读完了这本书,给我非常多的感悟。作者告诉我们,如何改善自己的人生,提供宝贵的思考方法。让我们自行设定有意义的人生旅...
    简书jianshu1阅读 9,732评论 0 3
  • 以前还认为自己心思细腻,呵呵,其实我的细腻全是在乎别人对我的感受和看法,以自我为中心,是自私的。没有看到儿子身上那...
    涂小倩阅读 115评论 0 0