下面是阅读 Java Cryptography Architecture(JCA) Reference Guide的一些笔记
Architecture
java 安全体系的结构
- Cryptographic Service Providers (加密服务提供者)
java.security.Provider 是所有安全服务提供者的基类,每一个CSP实例都包含了provider的名字和它实现了所有算法的名字。当需要一个特定算法的实例时,JCA就会查询provider,如果找到就返回相应的实例。
每个JDK安装了一个或者多个provider,需要更多的provider需要自己安装。
当在应用程序中使用JCA时,仅仅需要一个特定的对象和一个特定的算法/服务。例如MessageDigest对象中的MD5算法。这样便可以获得一个实例。对于provider的选取要么选择优先级最高的那个(如果没有指定具体的算法),要么选择指定的provider。
- provider的实现过程
每个引擎类提供的应用API都被实现相应SPI(Service Provider Interface)的类路由到provide的具体实现中。每一个引擎类都对应一个SPI。
调用过程:
假设需要使用AES算法。
.应用程序 调用 getInstance() 获得cipher 引擎类。
. cipher 引擎类要求JAC框架找到第一个满足AES的provider.
. JCA 框架查询所有的provider并且返回其中合适的一个provider.
. 然后provider找到相应的实现类,并创建实例和返回。
2. 密钥管理
keystore 可用来管理密钥和证书,它实现了java.security.KeyStore 类,应用程序可以向它请求数据用于认证、加密或者签名等。
JCA概念
Engine Classes
An engine class provides the interface to a specific type of cryptographic service, independent of a particular cryptographic algorithm or provider.
一些引擎类
- SecureRandom: 用来生成随机数。
- MessageDigest: 用来生成消息摘要(hash)和一些特定的数据
- Signature: 使用密钥初始化用来签名数据和验证数字签名。
- Cipher: 使用密钥初始化后用来加密、解密数据。包括例如对称分块加密(AES,DES,DESede,Blowfish, IDEA),流密码(RC4),非对称加密(RSA)以及基于密码的加密(PBE)
- Message Authentication Codes (MAC): 例如MessageDigests, 产生带密钥的hash值
6.KeyFactory: 用来转化现存的不透明的密钥到一个特殊格式。vice versa(反之亦然)。 - SecretKeyFactory: 与6类似,其是6的特例,只能用于对称密钥。
- KeyPairGenerator: 用来生成一组公私钥对。
- KeyGenerator: used to generate new secret keys for use with a specified algorithm.
- KeyAgreement:用特定的算法来进行密钥协商。
- AlgorithmParameters: 用来存储特定算法的相应参数包括加密解密的参数。u
- AlgorithmParameterGenerator :
- KeyStore: used to create and manage a keystore. A keystore is a database of keys. Private keys in a keystore have a certificate chain associated with them, which authenticates the corresponding public key. A keystore also contains certificates from trusted entities.
- CertificateFactory: used to create public key certificates and Certificate Revocation Lists (CRLs).