本书系《Java安全》第二版,内容涉及安全管理器、类装载器、存取控制器以及java.security包等。此外还讨论了消息摘要、证书和数字签名,并介绍了如何利用Java所提供的功能建立类签名,以及如何自行实现签名功能。通过介绍,您可以了解到如何编写一个类装载器,使之能够识别签名类,对签名进行验证,并可以结合安全管理器为类授予额外的特权。在本书中还讨论了与加密密钥管理有关的问题,以及如何以此为基础自行实现密钥管理系统。这里还详细介绍了如何应用Java安全套接字扩展包(JSSE)实现SSL加密,以及如何利用Java鉴别与授权服务(JAAS)处理鉴别和权限的有关问题。
本书作为一本基础参考书,主要面向为Internet编写应用软件的开发人员。如果您正在使用Java开发软件,就需要了解如何为您编写的类授予特权,而同时又不允许不可信类得到相应的特权。您还要了解如何保护系统不致遭到入侵和破坏。Java提供了有关的工具,而本书的目的就是告诉您如何使用这些工具。
前言\r\n\r\n第一章 Java应用安全\r\n\r\n什么是安全?\r\n本书所用的软件\r\nJava沙箱\r\n安全调试\r\n小结\r\n\r\n第二章 默认沙箱\r\n\r\nJava沙箱的要素\r\n权限\r\n密钥库\r\n代码源\r\n策略文件\r\n默认沙箱\r\njava.security文件\r\n与以前版本的比较\r\n小结\r\n\r\n第三章 Java语言安全\r\n\r\nJava语言安全结构\r\nJava语言规则的实施\r\n与以前版本的比较\r\n小结\r\n\r\n第四章 安全管理器\r\n\r\n安全管理器概述\r\n安全管理器的操作\r\n安全管理器的方法\r\n与以前版本的比较\r\n小结\r\n\r\n第五章 存取控制器\r\n\r\nCodeSource类\r\n权限\r\nPolicy类\r\n保护域\r\nAccessController类\r\n警卫对象\r\n与以前版本的比较\r\n小结\r\n\r\n第六章 Java类装载器\r\n\r\n类装载器与名称空间\r\n类载入体系结构\r\n实现类装载器\r\n类载入的其他内容\r\n与以前版本的比较\r\n小结\r\n\r\n第七章 加密介绍\r\n\r\n鉴别的需要\r\n鉴别的作用\r\n加密引擎\r\n小结\r\n\r\n第八章 安全提供者\r\n\r\n安全提供者体系结构\r\nProvider类\r\nSecurity类\r\n引擎类体系结构\r\n与以前版本的比较\r\n小结\r\n\r\n第九章 密钥与证书\r\n\r\n密钥\r\n密钥生成\r\n密钥工厂\r\n证书\r\n密钥、证书与对象序列化\r\n与以前版本的比较\r\n小结\r\n\r\n第十章 密钥管理\r\n\r\n密钥管理术语\r\n密钥工具(keytool)\r\n密钥管理API\r\n密钥管理实例\r\n秘密密钥管理\r\n与以前版本的比较\r\n小结\r\n\r\n第十一章 消息摘要\r\n\r\n消息摘要类的使用\r\n安全消息摘要\r\n消息摘要流\r\nMessageDigest类的实现\r\n与以前版本的比较\r\n小结\r\n\r\n第十二章 数字签名\r\n\r\nSignature类\r\n签名类\r\nSignature类的实现\r\n与以前版本的比较\r\n小结\r\n\r\n第十三章 基于密码的加密\r\n\r\n密码引擎\r\n密码流\r\n加封对象\r\n与以前版本的比较\r\n小结\r\n\r\n第十四章 SSL与HTTPS\r\n\r\nSSL与JSSE概述\r\nSSL客户与服务器套接字\r\nSSL会话\r\n5SL环境与密钥管理器\r\nSSL的其他相关问题\r\nHTTPS协议处理器\r\nJSSE的调试\r\n小结\r\n\r\n第十五章 鉴别与授权\r\n\r\nJAAS概述\r\n简单的JAAS程序设计\r\n简单的JAAS管理\r\n高级JAAS技术\r\n小结\r\n\r\n附录一 java.security文件\r\n附录二 安全资源\r\n附录三 基于身份的密钥管理\r\n附录四 安全Java容器\r\n附录五 实现JCE安全提供者\r\n附录六 速查手册\r\n词汇表
当我向一个同事说起我要写一本关于Java安全的书时, 他立刻就向我询问有关防火墙和Internet DMZ(译注1)方面的问题, 另一个同事听到我们的谈话后, 马上提出了关于电子商务的一些问题, 还有一个同事则对虚拟专用网表示了浓厚的兴趣.
这个现象本身就很有趣, 不过需要说明, 我所要讨论的是如何让Java applet获得读取文件的权限这样的内容.
如果题目中有"安全"两字, 往往就会造成以上的情形, 实际上, 安全是一个范围很广的研究领域, 每个人对安全都有自己的理解.Java安全和网络安全(包括Internet安全)既有互补的一面, 又有重叠的一面, 这使问题显得更加复杂.例如可以用Java在网络上传送加密数据, 这就需要在Java程序中设计加密策略, 此外还可以建立虚拟专用网, 从而对网络传送的所有信息都进行加密, 这种方式就不用在Java程序中自行设计加密策略了.
这本书将从Java程序的角度讨论安全.在书中, 我们将讨论Java基本平台中有关安全的特性, 主要包括类装载器.字节码校验器和安全管理器, 并且还将讨论Java在安全领域的最新进展, 包括数字签名.安全提供者和存取控制器等.本书的主旨是帮助读者建立对Java安全模型体系结构的理解, 并能充分了解如何在程序设计和管理两方面应用此安全模型.
读者对象
本书主要面向那些需要编写安全Java应用程序的程序员.书中重点介绍了Java中提供安全性的各种API.我们将讨论Java 2标准版中相关API的使用方法, 包括如何在自行开发的应用程序中使用这些API, 另外对于在Java P1ug-in中运行的applet, 本书也将介绍有关安全API的使用方法.任何一个版本的Java 2平台都支持Java Plug-in, 因此applet可以对浏览器不做要求, 而直接运行在虚拟机中.因此目前常用的浏览器中, 如Internet Explorer(版本3及更高版本).Netscape Navigator(版本4及更高版本)和Opera等等, 都提供了对Java 2的全面支持.在Navigator和Opera的最新版本中, Plug-in是其所支持的虚拟机的惟一形式.从安全性的角度来看这一点至关重要, 因为还没有任何一种内嵌在浏览器中的虚拟机能够提供对Java 2安全模型的支持.
本书的另一类读者是终端用户, 以及对Java安全感兴趣的系统管理员.书中将介绍基本Java平台所提供的安全功能, 同时还将说明Java应用程序和在Java Plug-in中的Java applet如何使用这些功能.我们不会过分深入地研究支持Java的浏览器本身的安全特性, 但会以发展的眼光指出浏览器供应商应如何调整Java安全特性.终端用户和系统管理员通过阅读本书(可以跳过一些编程实例), 将对Java平台的基本安全特性有所了解, 而且对于如何管理这些安全特性将有所认识.对于那些对Java使用的安全性(更严格地说应该是风险性)很感兴趣的终端用户或系统管理员来说, 这本书尤其有用:我们将详细地介绍Java安全模型的实现, 使读者可以直接利用此模型进行编程(必要时也可以对之进行调整), 此外, 书中还将深入阐述此安全模型的工作原理, 读者可以根据实际情况判断Java是否能够满足其安全需要.从编程的角度, 我们假设读者能够熟练使用Java进行编程, 尤其对Java应用程序的齐发有一定经验.在讨论高级安全特性和加密算法时, 我们也认为程序员只对相关API的使用感兴趣.因此, 我们只对数字签名做基础性的介绍, 并讨论如何创建和使用它, 而对作为数字签名基础的加密理论.数字签名提供安全保障的原因等内容则不深入讨论.对于精通此道的程序员, 我们还将介绍如何扩展这些API以支持新的加密算法, 不过有关加密的数学知识和严格的定义必须要用另一本书来详细说明了.
所用版本
本书主要介绍Java 2标准版.版本1.3(通常简称为1.3)的有关内容.Java 2平台的安全模型与Java l所提供的大相径庭.许多基本的安全接口如存取控制器只在Java 2中提供, 此外与Java l.1相比, Java 2版本中的一些API变化也很大.另一方面, Java 2中版本1.2和1.3之间的变化倒不明显, 因此我们所介绍的许多内容对1.2也是适用的.
在书中我们还讨论了三个Java扩展包:JCE(Java加密扩展包)1.2.1版本.JSSE(Java安全套接字扩展包)1.0.2版本以及JAAS(Java鉴别与授权服务)1.0版本.
这些扩展包都基于1.3版本的Java 2平台.
本书中所用的代码实例可以从O'Reilly的网站获得, 其网址为:http://www.oreilly.com/catalog/javasec2/.
本书约定
本书中, 以下内容将用等宽字体(constant width font)表示:
代码实例
类.变量和文本中出现的方法名
而以下内容则用斜体(Italicized font)表示:
文件名
主机和域名
URL地址
当第一次介绍新的方法或类时, 将以斜体表示它们, 如:public void checkAccess(Thread t)
这个函数的作用是检查当前线程是否能够修改参数t所指定线程的状态.
命令约定
在本书中许多地方都用到了命令, 特别是在讨论管理的章节和附录中有大量的命令出现.为统一起见, 约定将以UNIX系统平台为背景说明命令的执行情况, 如:piccolo%keytool -export-alias sdo -file/tmp/sdo.cer
Enter keystore password: ★★★★★★
Certificate stored in file </tmp/sdo.cer>
在这些命令实例中, 由用户或管理员输入的内容用黑体字(boldfont)表示, 其余的文本则是执行命令后所输出的结果(串piccolo%表示命令提示).在其他系统中, 需要对文件名做必要的调整以满足系统要求(如对Microsoft Windows系统, 就应该用形如C:\sdo.cer的文件名).但是一定要记住, 命令行参数通常指定的是一个URL地址而非文件名, 在URL地址中一定要用斜线而非反斜线.在这种情况下, 不同系统中的参数设置是相似的, 不过在Microsoft Windows系统中需要指定驱动器, 如Unix目录file:///files/sdo/在Microsoft Windows系统中应表示为file:/C:/files/sdo/.指定URL参数时, 还需要设置协议以区别它并非文件名, 实际上协议名仍被处理为串, 而不需要对协议进行分析.但是, 注意由于Microson windows系统通常使用斜线(/)来设置命令行选项, 而Java工具(以及相应的系统中)则一般使用连字符(-)来表示选项, 所以书中所举实例在不同平台上惟一的区别就在于文件名或URL名的差别.
代码约定
本书中的代码实例(以及在线实例)是按章节组织的.每个类将按照章的内容放在相应的包中.例如, 第三章中的Test类就在包javasec.samples.ch03中.解开代码时, 需要设置一个目录(javasec), 所有子目录和源文件都将按照层次关系作为其下级目录或文件建立. 有两种简单的处理方法.第一种方法是解开源代码时保持原目录, 不需设置类路径(classPath), 在引用时直接取包的绝对路径名即可.因此要编译和执行第三章中的Test类时, 需要如下命令行:
piccolo% javac javasec/samples/ch03/Test.java
piccolo% java javasec.samples.ch03.Test
Your account number is 0001 OO02 OO03 OO04还有一种方法, 即在源代码所在的目录下工作, 并设置类路径, 具体命令如下:
piccolo% javac -classpath../../.. Test.java
piccolo% java 一classpath ../../.. javasec.samples.ch03.Test Your account number is OOOl OO02 OO03 OO04
如果命令占多行, 就需要用到反斜线:
piccolo% java -classpath ../../.. javasec.samples.Ch09.PrintCert\
/files/sdo/foo/bar/very/long/command
以上命令可以在一行内输完, 或者, 如果需要占多行, 就必须用系统所要求的转义符进行连接(如Unix系统中的反斜线).
第二版中新增的内容
因为JSSE和JAAS最近才发布, 因此在本书第二版中专门针对这两个扩展包增加了相应的章节加以介绍.此外还介绍了JCEl.2.1所补充的内容, 并包括了调整后的代码实例.
第二版中对书中的内容也进行了重新整理, 新增了一章介绍默认沙箱及沙箱管理的内容.在第二版中内容和例子都是按主题进行组织的, 而不是以包为主线, 例如Diffie-Hellman密钥交换算法是在密钥管理一章介绍而不是在JCE中介绍的.我们将核心Java安全包和三个可选的安全扩展包作为一个完整的API对待(实际上在
将要发布的Java新版本中也是这样处理的).
建议与评论
本书的内容都经过测试, 尽管我们做了最大的努力, 但错误和疏忽仍然是在所难免的.如果你发现有什么错误, 或者是对将来的版本有什么建议, 请通过下面的地址告诉我们:
美国:
O'Reilly&Associates, Inc.
101Morris Street
Sebastopol, CA 95472
中国:
10008北京市海淀区知春路49号希格玛公寓B座809室
奥莱理软件(北京)有限公司针对此书我们建立了一个网页, 其中列出了勘误表.实例和其他信息.网页地址为:
http://www.oreilly.com/catalog/javasec2/
如果对本书有什么意见, 或存在技术问题, 可以发EMAIL至以下信箱:
bookquestions@oreilly.com要查找关于图书.会议.软件.资源中心和O'Reilly网络的其他信息, 请访问我们的网站:
http://www.oreilly.com
http://www.oreilly.com.cn