##关于JCE和JCA:
JCE 使用与 JCA 相同的体系结构,因此应该更恰当地将 JCE 视为 JCA 的一部分。
JDK 中的 JCA 包括两个软件组件:
- 定义和支持提供者提供实现的加密服务的框架。该框架包括诸如java.security、 javax.crypto、javax.crypto.spec和 javax.crypto.interfaces.
- 实际的提供者,例如Sun, SunRsaSign, SunJCE,它们包含实际的加密实现。
几个重要的类
重要的类:
引擎类,示例是 MessageDigest
、Signature
、KeyFactory
、KeyPairGenerator
和Cipher
类。
介绍
架构
加密服务提供者CSP( Cryptographic Service Providers)
java.security.Provider
是所有安全提供者的基类。每个 CSP 都包含此类的一个实例,其中包含提供者的名称并列出它实现的所有安全服务/算法。当需要特定算法的实例时,JCA 框架会查询提供者的数据库,如果找到合适的匹配项,则创建该实例。JDK默认的几个provider有(Sun
、 SunJSSE
、SunJCE
、SunRsaSign
)。
provider是可用算法的数据库。
应用程序需请求特定类型的对象(例如 a MessageDigest)和特定算法或服务(例如“SHA-256”算法),可以如下:
md = MessageDigest.getInstance("SHA-256"); //按顺序获取:没有指定provider,会顺序取第一个,ProviderB
md = MessageDigest.getInstance("SHA-256", "ProviderC");//按指定providerC获取:,会取ProviderC,如果ProviderC没有该算法则会抛出异常
1.顺序获取
2.按指定provider获取
Provider实现
每个引擎类中的应用程序 API 方法通过实现相应服务提供者接口 (SPI) 的类路由到提供者的实现。每个 SPI 类都是抽象的。要为特定算法提供特定类型服务的实现,提供者必须继承相应的 SPI 类并提供所有抽象方法的实现。
如:提供者CSP3的com.foo.AESCipher类是一个SPI实现类,实现了CipherSpi接口。
对于 API 中的每个引擎类,通过调用引擎类中的 getInstance() 工厂方法来请求和实例化实现实例。
import javax.crypto.*;
Cipher c = Cipher.getInstance("AES");
c.init(ENCRYPT_MODE, key);
这里应用程序需要一个“AES” javax.crypto.Cipher实例,而不关心使用哪个提供程序。
1、应用程序调用引擎类Cipher的getInstance(),JCA框架会找到第一个支持“AES”的Provider。
2、框架搜索每个Provider,最后在CSP3中找到合适的条目。
3、CSP3实现类com.foo.AESCipher,CipherSpi因此适合Cipher引擎类使用.
4、创建一个实例com.foo.AESCipher,并封装在一个新创建的实例中javax.crypto.Cipher,返回给应用程序。
5、当Cipher执行init()操作时,回路由调用AESCipher的engineInit()完成初始化
JCA概念
引擎类和算法
引擎类为特定类型的加密服务提供接口,独立于特定的加密算法或提供者。引擎提供:
- 加密操作(加密、数字签名、消息摘要等),
- 密码材料(密钥和算法参数)的生成器或转换器
- 封装加密数据并可在更高抽象层使用的对象(密钥库或证书)
可用引擎类
SecureRandom
:用于生成随机或伪随机数。MessageDigest
:用于计算指定数据的消息摘要(哈希)。Signature
:用密钥初始化,这些用于签署数据和验证数字签名。Cipher
:用密钥初始化,这些用于加密/解密数据。有多种类型的算法:对称批量加密(例如 AES)、非对称加密(例如 RSA)和基于密码的加密(例如 PBE)。- 消息验证码 (MAC):与
MessageDigest
s 一样,它们也生成哈希值,但首先使用密钥初始化以保护消息的完整性。 KeyFactory
:用于将现有的不透明加密密钥类型Key
转换为密钥规范(底层密钥材料的透明表示),反之亦然。SecretKeyFactory
:用于将现有的不透明加密密钥类型SecretKey
转换为密钥规范(底层密钥材料的透明表示),反之亦然。SecretKeyFactory
s 是专门KeyFactory
创建秘密(对称)密钥的 s。KeyPairGenerator
:用于生成适用于指定算法的新公钥和私钥对。KeyGenerator
:用于生成与指定算法一起使用的新密钥。KeyAgreement
: 由两方或多方用于商定并建立用于特定加密操作的特定密钥。AlgorithmParameters
:用于存储特定算法的参数,包括参数编码和解码。AlgorithmParameterGenerator
:用于生成一组适用于指定算法的算法参数。KeyStore
:用于创建和管理密钥库。密钥库是密钥的数据库。密钥库中的私钥具有与之关联的证书链,用于验证相应的公钥。密钥库还包含来自受信任实体的证书。CertificateFactory
:用于创建公钥证书和证书撤销列表 (CRL)。CertPathBuilder
:用于构建证书链(也称为证书路径)。CertPathValidator
:用于验证证书链。