应用程序不需要自己实现安全算法,它们只需要在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给出的某些类来方便地添加。
java.security.Provider 是所有这些providers的基础类。每个 provider 包含了该 CSP 的名字以及它所实现的所有算法的列表(见第4张图)。当应用程序需要使用一个特定的一个算法的时候,它可以向 JCA 请求,JCA 框架就会访问所有可用的 providers,然后从中选中一个合适的并为该应用程序创建一个算法的实例。
比如:
md = MessageDigest.getInstance("MD5");
md = MessageDigest.getInstance("MD5", "ProviderC");
对于上面两句代码和图示(摘自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"算法的一个实例。
"keystore" 可用来管理密钥和证书,它实现了java.security.KeyStore 类,应用程序可以向它请求数据用于认证、加密或者签名等。其中Sun Microsystems有一个默认的实现,它以文件的形式存储密钥和证书,格式为".jks",或者更安全一点的".jceks"。
引擎类(Engine Class),上节已经介绍过,具体再补充点。
引擎类定义了提供某种特定类型的密码服务的接口,独立于特定的密码算法(Algorithm),也独立于特定的CSP。
引擎提供如下服务:
@Ggicci 本文属于个人学习笔记,如有错误,希望您能指正!转载请注明出处,谢谢 :) [CSDN博客] |