每种强大的语言都有相应的密码安全方面的库,Java也有这样的库,即大名鼎鼎的JCA(Java Cryptography Architecture,Java密码学架构)。Java平台非常强调安全,包括语言安全、密码、公钥基础设施(PKI,Public Key Infrastructure)、认证、安全通信与访问控制。
JCA是Java安全平台的主要部分,包含一个“提供者”体系以及一系列的API,用于数字签名、消息摘要(hashs)、证书与证书验证、加密(对称/非对称,块/流密码)、密钥生成与管理以及安全随机数产生等。
JCA的基本概念
JCA是Java平台安全的基础,其他相关的还有JCE(Java Cryptography Extension,Java密码学拓展)、JSSE(Java Secure Socket Extension,用于SSL/TLS协议在Java内的实现)、JAAS(Java Authentication Authorization Service,Java的授权和认证服务)等。内容颇多,但我们还是要从基础讲起,先搭建环境建造地基。
JCA最早出现在JDK 1.1中,只有有限的功能,包括为数字签名和消息摘要而设计的API。为了增强和发展基于Java平台的密码学功能,到了JDK 1.2时已经有意使JCA扩展为框架结构。更为一般地讲,现在的JCA包含与密码有关的安全API(例如,新的支持X.5093证书的证书管理结构),一些提供器结构,允许多种可相互作用的密码学实现,以及与之相关的规则说明。
JDK 1.8的JCA包括一个提供者架构以及数字签名、消息摘要、认证、加密、密钥生成与管理、安全随机数产生等一系列API。它本身不负责算法的具体实现,任何第三方都可以提供具体的实现并在运行时加载。
这些接口使得开发者可以方便地将安全集成到应用程序中。JDK中的其他加密通信库很多使用了JCA提供者架构,包括JSSE、SASL、JGSS等。
JCA的设计原则
JCA设计遵循了以下两个原则:
(1)算法的独立性和可扩展性。
(2)实现的独立性和相互作用性。
JCA的目的是使API的用户建立密码的概念(注意是建立概念,而不是实现概念),例如数字签名和消息摘要,而不去关心如何实现这些概念或是用来实现这些概念的算法。所以,作为一个真正的密码人,光会调用API是不够的,我们还要会自己实现。与此同时,JCA提供标准的API,使得开发者能够请求指定的算法。
算法的独立性是通过定义密码服务类(service classes)来获得的,这些类提供了密码算法功能,例如MessageDigest(消息摘要)类、Signature(数字签名)类、KeyFactory(密钥工厂)类。
使用基于提供器的结构可得到实现的独立性。在JCA中,提供器(Provider)代表密码服务提供者(Cryptographic Service Provider, CSP)实现一个或多个JCA密码服务的一个或一系列程序包,例如数字签名算法、消息摘要程序包、密钥转换服务等。一个应用程序也许仅需要一个特殊服务(比如DSA签名算法)的特殊类型的对象(如Signature对象),并接收来自一个已安装的提供器的实现。另外,还可以从某个指定的提供器中实现这个操作。当更快或更安全的版本可用时,应用程序提供器会变得更加清晰。
JCA为密码软件市场带来了巨大的利益。一方面,对于软件开发者来说,可以只关心一套API而不用理会采用何种算法、安装哪一种提供器程序包。另一方面,密码工具包或是数据库可以在智能属性上(例如已模块化的算法和技术)达到相互一致,从而使性能得以优化。