第3章 Java加密利器

通过前第1、2章内容的学习,我们已经对密码学的理论有了一定的认识。那么,该如何将如此深奥却又如此关键的技术运用到我们的应用平台中呢?先别急,“工欲善其事,必先利其器”,先看看我们手里都有哪些工具可以驾驭这枚银弹!

从本章开始,我们将进入本书的主题—Java加密与解密的艺术。

3.1 Java与密码学

离开了安全问题,密码学就没有存在的价值。因此,在Java的世界里,密码学是其安全模块的重要组成部分。

3.1.1 Java安全领域组成部分

Java安全领域总共分为四个部分:JCA(Java Cryptography Architecture, Java加密体系结构)、JCE(Java Cryptography Extension, Java加密扩展包)、JSSE(Java Secure Sockets Extension, Java安全套接字扩展包)、JAAS(Java Authentication and Authentication Service, Java鉴别与安全服务)。

❑JCA提供基本的加密框架,如证书、数字签名、消息摘要和密钥对产生器。

❑JCE在JCA的基础上作了扩展,提供了各种加密算法、消息摘要算法和密钥管理等功能。我们已经有所了解的DES算法、AES算法、RSA算法、DSA算法等就是通过JCE来提供的。有关JCE的实现主要在javax.crypto包(及其子包)中。

❑JSSE提供了基于SSL(Secure Sockets Layer,安全套接字层)的加密功能。在网络的传输过程中,信息会经过多个主机(很有可能其中一台就被窃听),最终传送给接收者,这是不安全的。这种确保网络通信安全的服务就是由JSSE来提供的。

❑JAAS提供了在Java平台上进行用户身份鉴别的功能。如何提供一个符合标准安全机制的登录模块,通过可配置的方式集成至各个系统中呢?这是由JAAS来提供的。本书将要讨论的主要是JCA、JCE和JSSE。

JCA和JCE是Java平台提供的用于安全和加密服务的两组API。它们并不执行任何算法,它们只是连接应用和实际算法实现程序的一组接口。软件开发商可以根据JCE接口(也叫安全提供者接口)将各种算法实现后,打包成一个Provider(安全提供者),动态地加到Java运行环境中。

根据美国出口限制规定,JCA可出口(JCA和Sun的一些默认实现包含在Java发行版中),但JCE对部分国家是限制出口的。因此,要实现一个完整的安全结构,就需要一个或多个第三方厂商提供的JCE产品,称为安全提供者。BouncyCastle JCE就是其中的一个安全提供者。

安全提供者是承担特定安全机制的实现的第三方。有些提供者是完全免费的,而另一些提供者则需要付费。提供安全提供者的公司有Sun、Bouncy Castle等,Sun提供了如何开发安全提供者的细节。Bouncy Castle提供了可以在J2ME/J2EE/J2SE平台得到支持的API,而且Bouncy Castle的API是免费的。

JDK 1. 4版本及其后续版本中包含了上述扩展包,无须进行相应配置。在此之前,安装JDK后需要对上述扩展包进行相应配置。

Java安全体系结构通过扩展的方式,加入了更多的算法实现及相应的安全机制。我们把这些提供者称为安全提供者(以下简称“提供者”)。下述Properties文件中列举了JDK 1.6版本所提供的安全提供者的配置信息:


security.provider.1=sun.security.provider.Sun

security.provider.2=sun.security.rsa.SunRsaSign

security.provider.3=com.sun.net.ssl.internal.ssl.Provider

security.provider.4=com.sun.crypto.provider.SunJCE

security.provider.5=sun.security.jgss.SunProvider

security.provider.6=com.sun.security.sasl.Provider

security.provider.7=org.jcp.xml.dsig.internal.dom.XMLDSigRI

security.provider.8=sun.security.smartcardio.SunPCSC

security.provider.9=sun.security.mscapi.SunMSCAPI


上述这些提供者均是Provider类(java.security.Provider)的子类。其中sun.security.provider.Sun是基本安全提供者,sun.security.rsa.SunRsaSign是实现RSA算法的提供者。

Java安全体系不仅支持来自Sun官方提供的安全提供者,同时也可配置第三方安全提供者以扩展相应的算法实现等。

安全提供者实现了两个概念的抽象:引擎和算法。引擎可以理解为操作,如加密、解密等。算法则定义了操作如何执行,如一个算法可以理解为一个引擎的具体实现。当然,一个算法可以有多种实现方式,这就意味着同一个算法可能与多个引擎的具体实现相对应。

安全提供者接口的目的就是提供一个简单的机制,从而可以很方便地改变或替换算法及其实现。在实际开发中,程序员只需要用引擎类实现特定的操作,而不需要关心实际进行运算的类是哪一个。

Provider类和Security类(java.security.Security)共同构成了安全提供者的概念。我们将在本章介绍这两个类的Java API。