Java 密码学架构 - Java Cryptography Architecture (JCA)

设计原则(Design Principles)

设计原则:

  1. 实现上的独立性和互操作性(Implementation independence and interoperability)
  2. 算法上的独立性和可扩展性(Algorithm independence and extensibility)

如何实现

  • 实现上的独立性

应用程序不需要自己实现安全算法,它们只需要在Java平台中请求安全服务即可。其中,安全服务的实现是在供应者("providers")中完成的,而 providers通过标准的接口以插件的形式存在于Java平台中。因此,实现上的独立性是通过这种基于供应者的架构("provider"-based architecture)而达成的。术语 CSP(Cryptographic Service Provider – 密码服务供应者)和本文中的 providers 是同义词,可交换使用。

  • 实现上的互操作性

Providers 在各种应用程序之间可以彼此协作。也就是应用程序可以使用不同的 providers,同时,一个 provider 也可以为多个程序服务。

  • 算法上的独立性

Java 平台定义了一些不同类型的与密码相关的引擎("engines")或者叫服务("services"),然后定义了为这引擎提供功能的类,叫做引擎类("engine classes"),比如:MessageDigest、Signature、KeyFactory、Cipher等。

  • 算法上的可扩展性

    第三方的密码算法可以通过扩展JCA给出的某些类来方便地添加。

架构(Architecture)

密码服务提供者(CSP)

java.security.Provider 是所有这些providers的基础类。每个 provider 包含了该 CSP 的名字以及它所实现的所有算法的列表(见第4张图)。当应用程序需要使用一个特定的一个算法的时候,它可以向 JCA 请求,JCA 框架就会访问所有可用的 providers,然后从中选中一个合适的并为该应用程序创建一个算法的实例。

比如:

md = MessageDigest.getInstance("MD5");

md = MessageDigest.getInstance("MD5", "ProviderC");

Java 密码学架构 - Java Cryptography Architecture (JCA)_第1张图片
 

对于上面两句代码和图示(摘自JavaDoc1.7),图中有三个 CSP,分别是 ProviderA、ProviderB 和ProviderC,应用程序向 JCA 请求 "MD5"算法服务,JCA通过搜索所有可用的 CSP来返回合适的算法实体。对于第一句代码,看图中左半部分,JCA查找到 ProviderA,而ProviderA提供了"SHA-1"和"SHA-256"算法,并没有"MD5"算法,所以不合适,继续搜索,找到 ProviderB,因为它里面有"MD5"算法,故返回该算法的一个实例;而对于第二句代码,看图中右半部分,它指定了从ProviderC中获取"MD5"算法服务,故JCA直接返回ProviderC中的"MD5"算法的一个实例。

CSP具体是怎么实现的

Java 密码学架构 - Java Cryptography Architecture (JCA)_第2张图片Java 密码学架构 - Java Cryptography Architecture (JCA)_第3张图片Java 密码学架构 - Java Cryptography Architecture (JCA)_第4张图片

  • Engine Class:为应用程序提供高层的密码安全服务接口,每个引擎类都有一个与之对应的 SPI 类
  • SPI:与引擎类对应的抽象类,用来为引擎类提供具体的算法实现,也就是说,引擎类提供应用程序接口,这些接口方法会路由到 CSP 内部的对应算法的实现,所以,每个 CSP 中的每个算法都应该实现某个 SPI 所声明的所有方法,比如某个 "AES"加密算法,封装在一个叫 AESCipher 的类中,那么它应该这样做: class AESCipher extends CipherSpi { … },然后它就可以被安装到某个 CSP中(下图摘自 JavaDoc1.7)。

 

密钥管理(Key Management)

"keystore" 可用来管理密钥和证书,它实现了java.security.KeyStore 类,应用程序可以向它请求数据用于认证、加密或者签名等。其中Sun Microsystems有一个默认的实现,它以文件的形式存储密钥和证书,格式为".jks",或者更安全一点的".jceks"。

JCA概念(JCA Concepts)

引擎类和算法(Engine Classes and Algorithms)

引擎类(Engine Class),上节已经介绍过,具体再补充点。

引擎类定义了提供某种特定类型的密码服务的接口,独立于特定的密码算法(Algorithm),也独立于特定的CSP。

引擎提供如下服务:

  1. 密码相关操作(加密、签名、信息摘要…)
  2. 密码材料的生成器和转换器(密钥、算法的参数…)
  3. 对象(密钥管理、证书…)
Java 密码学架构 - Java Cryptography Architecture (JCA)_第5张图片 Java 密码学架构 - Java Cryptography Architecture (JCA)_第6张图片Java 密码学架构 - Java Cryptography Architecture (JCA)_第7张图片Java 密码学架构 - Java Cryptography Architecture (JCA)_第8张图片Java 密码学架构 - Java Cryptography Architecture (JCA)_第9张图片
@Ggicci 本文属于个人学习笔记,如有错误,希望您能指正!转载请注明出处,谢谢 :) [CSDN博客] 

你可能感兴趣的:(Java 密码学架构 - Java Cryptography Architecture (JCA))