前言

为什么要写这本书

当你在用IM与好友聊天时,当你通过B2C网站购物时,当你用邮件与客户交流时,当你公司的应用服务器与合作伙伴交换商业数据时⋯⋯你是否考虑过你的数据是否安全?你的隐私是否会泄露?你的银行卡是否会被盗用?你的竞争对手是否能破解你的敏感数据?

任何一项通过网络交互的数据都有可能是不安全的,而我们却越来越依赖于网络。用户密码、聊天消息、银行卡号、邮件信息、商业敏感数据,如果通过明文传输,后果不堪设想。自己的账号被盗用、隐私成为公共话题、信用卡被人滥用、竞争对手盗用自己的数据⋯⋯于是,为了确保数据不被侵犯,数据加密与解密技术应运而生,成为众多应用中的一项核心技术。

众所周知,Java EE是目前企业应用中使用最广泛的语言之一,几乎在任何一个领域都能看到Java EE的身影。随着加密与解密算法的发展,Java加密与解密技术不断演进,不断提高着数据的安全性,已成为各大企业应用中一项关键性的技术。

很多企业应用领域的架构师都很关注加密与解密算法在应用中的使用,例如用户密码加密、网络协议加密等。如何在名目繁多的Java加密与解密技术中选择合适的算法进行企业级应用开发,如何解决Java加密与解密技术在开发过程中遇到的各种问题,成为许多开发者,尤其是架构师关注的焦点问题。然而,国内目前还没有哪一本书能解决这些问题。笔者因工作需要,采用Java加密与解密技术成功构建了企业级网银系统。在开发过程中,笔者感受到了Java加密与解密技术的精妙。笔者希望把自己Java加密与解密技术运用在企业应用开发领域的经验和心得分享给广大读者,以帮助大家掌握提升企业应用的安全性的方法。

本书面向的读者

本书主要适合于以下读者:

(1)所有利用Java进行企业级应用开发的软件工程师

对于企业级应用软件工程师来讲,这将是一次系统的密码学之旅。本书将为您介绍密码学理论、Java相关算法实现、开源组件包、数字证书与安全协议等相关内容,并配有相关实例为您提供详尽实现指导,为您构建企业级安全应用提供完整的技术支持。

(2)系统架构师

对于系统架构师来讲,如何使用成熟技术快速构建安全企业应用是安全工作的第一要务。

在算法方面,本书详述了Java 7对于密码学算法的相关实现,针对AES算法密钥长度受限问题给出解决办法。同时,针对当前Java 7不支持的算法,如SHA224、ElGamal和ECDSA等,本书详细介绍了如何使用第三方开源加密组件包Bouncy Castle进行相关算法实现补充,并且对Apache Commons Codec进行了详尽的介绍。这些成熟的组件包都是构建安全企业应用必不可少的工具包。在架构方面,本书浓墨重彩地介绍了数字证书的构建、SSL/TLS协议服务搭建,并通过相关实例介绍如何构建单向/双向认证服务。

(3)其他安全领域的软件工程师

如今企业级应用已经逐步转变为以服务为主的异构体应用,如Web Service应用等。Java加密算法实现遵循密码学相关国际标准,完全可以与其他计算机语言(如C++、C#等)构建的异构体应用进行数据加密交互。本书为读者选择合适算法及实现提供了详尽的技术支持。

如何阅读本书

全书一共分为3个部分:基础篇、实践篇、综合应用篇。

(1)基础篇

本篇共包含4章,主要对Java企业级应用安全、密码学理论和Java中与加密相关的API进行了详细介绍,并详细阐述了第三方组件包Bouncy Castle及与Apache Commons Codec相关的API。

第1章主要阐述了当前的安全问题,并给出了安全的相关标准。本书将在后续章节中通过各个算法介绍逐一实现这些标准,这些标准同样是评判系统安全级别的准则。

第2章主要详述了密码学相关理论知识,并回顾密码学的发展历程。如果您不曾接触过密码学,本章将是您了解密码学理论的基础教程。本书后续章节会多处应用本章介绍的相关技术名词。

第3章主要详述了Java 7安全领域相关API内容,为您详尽介绍每一个与密码学相关的类以及方法。本章将是每位安全领域软件工程师必读内容,您将在阅读本书的后续章节时经常翻阅本章内容。

第4章主要介绍了如何通过权限文件加强系统安全级别,并详述了开源组件Bouncy Castle及与Apache Commons Codec相关API内容。如果您正苦于AES算法密钥长度受限,SHA224、ElGamal、ECDSA等算法缺少支持等问题,那么请您阅读本章;如果您非常希望找到Base64及十六进制编码算法的成熟开源组件,也请您阅读本章。本书将在后续章节中介绍如何使用这些开源组件并实现相关算法。

(2)实践篇

本篇主要对现今流行的所有加密算法进行了全面阐述和深入剖析,并配合相关测试用例演示算法实现。在阅读本篇前,请阅读第2章相关理论知识,并了解第3~4章相关API内容。本篇将是所有企业级应用Java软件工程师的必读内容。

第5章介绍了极为简单的Base64算法,该算法可以作为加密算法入门算法。如果您仅需要确保应用交互的数据可以达到隐藏的目的,那么在第5章中您一定可以找到满意的答案。

第6章主要详述了MD系列、SHA系列以及MAC系列三大消息摘要算法相关实现,并详细介绍了如何使用Bouncy Castle构建Java 7所不支持的算法实现。对于一般网络应用,经常需要为下载软件提供对应的摘要信息以校验文件完整性。相信在阅读完本章后,您便可熟练使用Apache Commons Codec为应用实现校验文件完整性的需求。

第7章将沿着对称加密算法的发展历程,详述了DES、DESede、AES和PBE四大算法的实现细节,并详细介绍了如何使用Bouncy Castle构建目前较为常用的IDEA算法。这些算法适用于中小型企业级应用网络数据加密交互需求,同时也适用于其他安全领域相关需求,是应用最为广泛的加密算法,更是密码学领域的核心算法。如果您仅想通过对称加密算法及消息摘要算法构建简单的加密网络应用,那么本章提供的实例将非常适合您。

第8章主要详述了构建于对称加密算法之上的非对称加密算法,包括DH、RSA和ElGamal三大常用算法。本章是本书后续内容的基础,数字签名算法、数字证书、安全协议等内容都与本章内容息息相关,请您在阅读后续章节前仔细阅读本章。如果您对单向/双向认证服务底层实现非常感兴趣,并想要知道它的来龙去脉,那么本章就是您探究该技术旅途上的第一个驿站。

第9章详述了基于消息摘要算法和非对称加密算法之上的数字签名算法,包括RSA、DSA和ECDSA三大常用算法。数字签名算法是消息摘要算法的延续,是单向/双向认证服务核心认证技术。如果您想通过非对称加密算法构建简单的网络加密应用,并期望使用数字签名算法对数据进行校验,那么本章的实例将非常适合您。(3)综合应用篇

本篇不仅细致地介绍了加密技术对数字证书和SSL/TLS协议的应用,还以示例的方式讲解了加密解密技术在实际网络中的各种应用,极具实践指导性。请您在阅读本章前仔细阅读实践篇相关内容。本篇内容将是系统架构师的最爱。

第10章详细介绍了如何使用KeyTool和OpenSSL两大工具进行数字证书管理,并详细介绍了如何在Java中使用数字证书。数字证书是非对称加密算法公钥的载体,是SSL/TLS协议和单向/双向认证服务的基础。如果您想要构建安全的HTTPS网络服务应用,请先阅读本章。

第11章主要介绍了SSL/TLS协议及单向/双向认证服务。这将是您探究单向/双向认证服务技术旅途上的最后一站。本章详述了如何通过简单配置Tomcat服务器快速构建单向/双向认证服务,内容翔实、极具实践性。

第12章是本书的实例集合,通过三套网络应用实例揭示常规网络应用安全、即时通信网络应用安全和以数据交互为主的Web Service应用安全,并通过网络监测工具WireShark对其效果进行检测。通过不同算法的组合,三套实例逐步升级自身系统的安全级别,极具指导意义。您将在本章找到解决网络安全问题的可行性参考。

通过阅读本书,读者不仅能全面掌握Java加密与解密的各种基础知识,还能进一步了解Java加密与解密的高级技术和技巧,从而将这些知识都运用到实际开发中去。

新版变更说明

对比上一版本,在新版中主要对JDK、Bouncy Castle等进行了版本更新,补充了新版本中特有的算法实现与实例,并对上一版中存在的疏漏进行了修正。新版内容基于Java 7,对比Java 6其在安全性上有所提升。新增了EC算法安全提供者,同时增加了用于EC密钥构建的API等。根据笔者的观察,种种现象预示着在Java SE后续版本中可能会进一步增强EC系列算法的相应实现,如ECDH算法等。同时,一些只能在Bouncy Castle中才能实现的算法,正被Java SE 7所蚕食,如SHA256withRSA算法等。在新版中引入了Bouncy Castle 1.49,扩展了对于OpenSSL的PEM文件操作实现等。同时,应读者需求,新版中补充了OpenSSL在Base64、消息摘要方面的操作运用。

读者约定

本书内容主要基于Java 7,书中的代码实现请参考相关API。

在本书中,我们用环境变量%JDK_HOME%来表示JDK的安装路径;用环境变量%JRE_HOME%来表示JRE的安装路径。如将JDK安装在C:\java\jdk目录下,变量%JDK_HOME%则指向该目录。相应的,如将JRE安装在C:\ java \jre目录下,变量%JRE_HOME%则指向该目录。

本书代码演示所使用的IDE为Eclipse。

阅读本书前,我们约定您已了解了以下内容:

(1)测试组件包—JUnit

本书将通过测试工具JUnit,以白盒测试的方式演示如何使用Java完成相应的加密与解密操作。

本书将使用JUnit 4.5版本,以注解的方式构建白盒测试。读者可通过其官方网站(http://www.junit.org/)下载最新版本。

(2)编码组件包—Commons Codec

Commons Codec(http://commons.apache.org/codec/)是一款开源编码组件,它位于国际开源组织Apache(http://www.apache.org/)旗下。它对Java API做了进一步封装,用于Hex、Base64编码增强实现。本书中使用的版本为1.4。读者朋友可通过其官方网站下载最新版本。

(3)加密组件包—Bouncy Castle

Bouncy Castle(http://www.bouncycastle.org/)是一个开源加密组件。它提供了多种Java API所不支持的算法实现,如消息摘要算法MD4和SHA224、对称加密算法IDEA、数字签名算法ECDSA等。本书中使用的版本为1.49。

(4)网络监听工具—WireShark

本书将通过网络监听工具WireShark完成对网络数据的监控,请读者参考相关文档。读者可通过其官方网站(http://www.wireshark.org/)下载最新版本。

(5)密码&证书管理工具—OpenSSL

OpenSSL(http://www.openssl.org/)是一个基于命令行密码&证书管理工具,可用于密钥的生成、加密/解密、签名/验证、数字证书管理等。