《深入Java? 2平台安全》一书,是关于Java安全平台的权威且全面的指南。本书针对当前诸多领先科技企业所采用的Java安全技术进行了更新,以体现其关键的内容追加和版本修订。本书为第二版,由Sun Microsystems的Java安全专家撰写,提供对Java安全体系核心机制的深入解析,描述即使在最苛刻计算环境中仍然可以成功实现的工具和技术。Java总是提供比其它平台更强的安全模型,而本书则回顾了用来增强安全性而不会牺牲功能特性的方法和实践。通过采用一些定制、扩展和优化Java安全体系结构的技巧,用户将能够使用所需的一切方法来保护其信息资产免受内外攻击。
本书深入讲述了安全体系结构、部署、定制、最新进展等诸多方面,包括:
安全基础知识
类的安全加载
制定粒度适合的安全策略
使用AccessController、SecurityManager等来执行安全策略
数字证书、证书路径、代码签名、JAAS,以及其它鉴别方法
基于Java的密码学机制,并提供了代码范例
用于网络安全的JSSE、Java GSS-API和RMI
预览了其它平台的安全议题,包括Java Card、J2ME和Jini
《深入Java? 2平台安全》一书为系统管理员和软件从业者撰写,提供用Java? 2平台构建和维护安全系统的关键知识。本书还提供了详细的代码和使用范例,为平台安全所需的各方面内容提供了不可缺少的资源。
译序 (iii)
第二版序言 (xv)
本书的组织结构 (xvi)
致谢 (xvii)
作者介绍 (xx)
第一版序言 (xxi)
第一版致谢 (xxii)
第1章 计算机和网络安全基础 (1)
1.1 密码学与计算机安全 (2)
1.2 威胁和防护 (3)
1.3 外围防护 (4)
1.3.1 防火墙 (6)
1.3.2 仅仅使用外围防护的不足之处 (7)
1.4 访问控制与安全模型 (8)
1.4.1 MAC 和DAC模型 (8)
1.4.2 对数据和信息的访问 (9)
1.4.3 静态和动态模型 (10)
1.4.4 关于使用安全模型的几点考虑 (11)
1.5 密码系统的使用 (12)
1.5.1 单向散列函数 (13)
1.5.2 对称密码 (14)
1.5.3 非对称密码 (15)
1.6 鉴别 (16)
1.7 移动代码 (19)
1.8 Java安全性的适用范围 (20)
第2章 Java语言的基本安全特点 (23)
2.1 Java语言和平台 (24)
2.2 早期的基本安全构架 (25)
2.3 字节码验证和类型安全 (27)
2.4 签名Applet (29)
2.5 进一步增强 (30)
第3章 Java 2安全体系结构 (31)
3.1 Java 2平台安全体系结构的需求 (31)
3.1.1 灵活的访问控制 (32)
3.1.2 将策略表示和策略执行分离开来 (33)
3.1.3 执行灵活的可扩展的安全策略 (33)
3.1.4 灵活且可定制的安全策略 (33)
3.1.5 完善而简单的内部安全机制 (34)
3.2 Java 2安全体系结构综述 (34)
3.3 体系结构总结 (35)
3.4 经验教训 (38)
第4章 类的安全装载 (41)
4.1 类文件、类型以及类装载器的定义 (42)
4.2 常用的类装载器实例 (42)
4.3 类装载器的层级体系 (43)
4.3.1 类装载器继承层级体系 (43)
4.3.2 类装载器委托层级体系 (45)
4.4 类的加载 (47)
4.4.1 类的查找 (47)
4.4.2 类的定义 (50)
4.4.3 ClassLoader的其它方法 (51)
4.5 有关SecureClassLoader的细节 (52)
4.6 有关URLClassLoader的细节 (53)
4.7 类路径(Class Paths) (55)
第5章 安全策略的元素 (57)
5.1 许可权限(Permissions) (58)
5.1.1 许可权限类层级体系 (59)
5.1.2 常用的许可权限类 (60)
5.1.3 许可权限集合 (66)
5.1.4 许可权限中的隐含意义 (68)
5.1.5 正向与负向许可权限 (68)
5.2 描述代码 (69)
5.2.1 CodeSource (69)
5.2.2 测试CodeSource的等同性以及隐含(Implication)的使用 (71)
5.2.3 身份(Principal) (74)
5.3 保护域(ProtectionDomain) (74)
5.3.1 ProtectionDomain构造函数 (75)
5.3.2 ProtectionDomain的implies方法 (77)
5.3.3 ProtectionDomain的优点 (78)
5.4 安全策略 (79)
5.5 分配许可权限 (83)
5.6 动态安全策略 (84)
第6章 执行安全策略 (87)
6.1 SecurityManager类 (87)
6.1.1 安全管理器使用范例 (88)
6.1.2 SecurityManager API (88)
6.1.3 checkPermission方法 (89)
6.2 AccessControlContext (90)
6.3 DomainCombiner (91)
6.4 AccessController (92)
6.4.1 AccessController的接口设计 (93)
6.4.2 基本访问控制算法 (94)
6.4.3 方法的继承 (97)
6.4.4 用特权操作扩展基本算法 (98)
6.4.5 特权行为编程习惯用语 (102)
6.4.6 继承访问控制上下文 (105)
6.4.7 特权访问控制上下文 (106)
6.4.8 完全访问控制算法 (107)
6.4.9 SecurityManager vs. AccessController (109)
6.4.10 特权操作简史 (110)
第7章 定制安全架构 (113)
7.1 创建新的许可类型 (113)
7.2 定制安全策略 (118)
7.2.1 定制安全策略的执行 (118)
7.2.2 定制安全策略决定 (120)
7.3 定制访问控制上下文 (124)
第8章 建立信任 (127)
8.1 数字证书 (128)
8.1.1 X.500识别名(Distinguished Name) (129)
8.1.2 X.509证书版本 (129)
8.1.3 X.509证书内容 (130)
8.1.4 获取证书 (131)
8.2 用认证路径建立信任 (132)
8.2.1 核心认证API (133)
8.2.2 基本认证路径类 (135)
8.2.3 认证路径验证类 (135)
8.2.4 认证路径创建类 (136)
8.2.5 证书/CRL存储类 (137)
8.2.6 PKIX类 (137)
8.3 在签名代码中建立信任 (138)
8.3.1 用数字签名来保护消息 (138)
8.3.2 JAR文件格式概述 (139)
8.3.3 在运行时建立信任 (141)
8.4 使用JAAS进行以用户为中心的鉴别和授权 (141)
8.4.1 主题(Subjects)和身份(Principals) (143)
8.4.2 凭证(Credentials) (144)
8.4.3 可插拔和堆栈式鉴别 (145)
8.4.4 回调 (148)
8.4.5 授权(Authorization) (149)
8.4.6 基于Principal的访问控制 (150)
8.4.7 访问控制的实现 (150)
8.5 分布式终端实体鉴别 (152)
8.5.1 java.net.Authenticator (153)
8.5.2 Kerberized环境中的单点登录 (153)
8.5.3 JSSE鉴别机制 (155)
第9章 对象安全 (157)
9.1 安全异常 (158)
9.2 字段和方法 (158)
9.3 静态字段 (160)
9.4 私有对象状态和对象不变性 (161)
9.5 特权代码 (162)
9.6 串行化 (163)
9.7 内部类 (167)
9.8 本地方法 (167)
9.9 签名对象 (168)
9.10 对象密封 (171)
9.11 警觉对象(Guarding Objects) (172)
第10章 密码学编程 (177)
10.1 密码学概念 (178)
10.2 设计原则 (179)
10.3 密码服务和服务提供者 (180)
10.4 核心密码类 (187)
10.4.1 Security类 (187)
10.4.2 Provider类 (188)
10.4.3 MessageDigest类 (188)
10.4.4 Signature类 (190)
10.4.5 算法参数 (192)
10.4.6 Key类和KeySpec类 (196)
10.4.7 KeyFactory类和CertificateFactory类 (200)
10.4.8 KeyPair类和KeyPairGenerator类 (202)
10.4.9 KeyStore类 (203)
10.4.10 随机性和种子生成器 (206)
10.5 其它密码学类 (208)
10.5.1 Cipher类 (208)
10.5.2 KeyGenerator类 (215)
10.5.3 SecretKeyFactory类 (216)
10.5.4 KeyAgreement类 (217)
10.5.5 Mac类 (219)
10.6 代码实例 (220)
10.6.1 计算消息摘要 (220)
10.6.2 生成公私钥对 (222)
10.6.3 生成并且验证签名 (222)
10.6.4 读取包含证书的文件 (225)
10.6.5 使用加密 (226)
10.6.6 使用基于密码的加密 (227)
10.6.7 其它样例程序 (230)
10.7 标准名 (230)
10.7.1 消息摘要算法 (230)
10.7.2 密钥和参数算法 (231)
10.7.3 数字签名算法 (231)
10.7.4 随机数生成算法 (232)
10.7.5 证书类型 (232)
10.7.6 密钥库类型 (233)
10.7.7 服务属性 (233)
10.7.8 加密算法、模式和填充方式 (233)
10.7.9 密钥生成算法 (236)
10.7.10 密钥算法 (236)
10.7.11 MAC算法 (236)
10.8 算法规范 (237)
10.8.1 SHA-1消息摘要算法 (238)
10.8.2 MD2消息摘要算法 (238)
10.8.3 MD5消息摘要算法 (238)
10.8.4 数字签名算法 (238)
10.8.5 基于RSA的签名算法 (238)
10.8.6 DSA密钥对生成算法 (239)
10.8.7 RSA密钥对生成算法 (240)
10.8.8 DSA参数生成算法 (240)
第11章 网络安全 (241)
11.1 Java GSS-API (242)
11.1.1 Java GSS-API中使用Kerberos凭证 (242)
11.1.2 建立安全上下文 (247)
11.1.3 消息安全 (249)
11.2 JSSE (249)
11.2.1 建立SSL上下文 (250)
11.2.2 SocketFactory和ServerSocketFactory类 (250)
11.2.3 SSLSocket和SSLServerSocket类 (251)
11.2.4 SSLSocketFactory和SSLServerSocketFactory类 (251)
11.2.5 SSLSession接口 (252)
11.2.6 HttpsURLConnection类 (253)
11.2.7 SunJSSE提供者 (254)
11.2.8 SSLContext类 (254)
11.2.9 生成SSLContext对象 (255)
11.2.10 TrustManager接口 (256)
11.2.11 TrustManagerFactory类 (256)
11.2.12 KeyManager接口 (258)
11.2.13 KeyManagerFactory类 (258)
11.3 远程方法调用(RMI) (260)
11.3.1 RMI安全基础 (260)
11.3.2 RMI激活 (261)
11.3.3 安全RMI通讯 (261)
第12章 部署安全架构 (265)
12.1 安装最新的Java2平台软件 (266)
12.2 的安装目录 (266)
12.3 设置系统和安全属性 (267)
12.3.1 设置系统属性 (267)
12.3.2 user.home系统属性的默认值 (268)
12.3.3 设置安全属性 (268)
12.4 为部署提供安全性 (269)
12.4.1 限制属性重写机制 (270)
12.4.2 配置应用相关的策略 (270)
12.5 安装提供者包 (271)
12.5.1 安装提供者类 (272)
12.5.2 配置提供者 (273)
12.6 策略配置 (274)
12.6.1 配置系统范围和用户指定的策略 (274)
12.6.2 默认策略文件格式 (276)
12.6.3 策略文件范例 (281)
12.6.4 策略文件中的属性扩展 (283)
12.6.5 配置可选的策略类实现 (285)
12.7 JAAS登录配置文件 (286)
12.7.1 登录配置文件结构和内容 (286)
12.7.2 登录配置文件位置 (288)
12.8 安全工具 (289)
12.8.1 Keystore数据库 (289)
12.8.2 keytool工具 (292)
12.8.3 jarsigner (301)
12.9 X.500识别名(Distinguished Names) (306)
12.10 为非专业用户管理安全策略 (307)
第13章 其它平台和未来发展方向 (309)
13.1 Java Card概述 (310)
13.1.1 虚拟机寿命 (311)
13.1.2 Java Card远程方法调用(JCRMI) (312)
13.1.3 Java Card的Applet隔离和对象共享模型 (313)
13.1.4 Java Card安全API (314)
13.2 Java 2 Micro Edition(J2ME)介绍 (314)
13.3 J2SE范围内的安全增强 (316)
13.3.1 虚拟机增强 (316)
13.3.2 语言增强 (316)
13.3.3 可信计算基础的增强 (317)
13.3.4 可插入式安全提供者的发展 (318)
13.3.5 安全表达式 (319)
13.3.6 安全管理 (319)
13.4 Jini网络技术简介 (320)
13.4.1 Jini技术安全体系架构简介 (320)
13.4.2 约束模型 (321)
13.4.3 建立策略信任 (322)
13.4.4 动态代理 (322)
13.5 J2EE简介 (323)
13.6 客户端容器 (324)
13.7 结论 (325)
参考书目 (327)
索引 (339)
“有些东西,只有失去后才知道其可贵”,于企业IT资源而言正是如此。因此我们常常会谈起安全的重要性,并衍生出很多安全方面的话题。本书谈的正是对所有关注Java平台的人很重要的话题——Java平台安全。
Java的诞生促进了新一轮的分布式计算浪潮,它的分布式优越性和可移植性亮点受到众多开发人员的青睐,另一方面,Java在企业应用中的日益普及和深化,也带来了安全方面的挑战。现在很多企业面临的状况让人难以乐观,很多Java开发者关注Java安全不够,或者有的软件设计者在开发时根本没有将安全考虑在内,这将给应用带来安全性和可扩充性方面的问题。实际上,Java平台本身具有内置的一致的安全特性,其提供的API也是建立在计算领域多年的经验和知识积累基础上的,从而确保了可靠性、可用性、易用性。留给我们的只是如何学习和运用的问题了。
安全本身是蕴涵矛盾的问题,任何保证安全的措施其实也是一道无形的屏障,会带来一定的运行效率的损失,同时在开发上也需要加入更加完备的考虑。如何在效率和安全性之间做出很好的权衡呢?“工欲善其事,必先利其器”,首先我们要知道在安全上现有哪些手段、部署这些手段的要点是什么、部署的优劣在哪里等。只有在完备的知识体系基础上,我们才能有所依据地进行取舍,进而灵活地运用它们——这自然需要一些权威的核心材料和书籍,而《深入Java™ 2平台安全》的出现,无疑正满足了我们的需要。本书第一版由现任Sun公司中国工程研究院院长宫力博士撰写,第二版仍旧由宫力博士以及其他Sun公司Java安全平台核心开发团队的人员来撰写,其权威性是相当高的。
本书侧重于介绍Java安全API的设计和实现,但并不同于一般介绍Java安全的书籍,后者一般只是笼统地罗列Java安全API。本书则由处于Java安全平台设计和开发一线的专家撰写,不仅讲述了Java安全API是什么样的(What),而且介绍了为什么Java安全API要设计成这个样子而不是其它(How),进而介绍了很多安全方面的基本原理和一些研究文献成果。因此从某种意义上说,本书不仅仅是一本关于Java安全的书籍,它覆盖了很多通用安全的知识,并涉及到操作系统、分布式应用、虚拟机机制、安全集成、网络协议等方面的知识——当然,本书对这些涉及到的知识并不作深入介绍,只是给有兴趣深入研究的读者一个方向,而这完全可以认为也是本书的一个亮点。整体说来,本书对于从事安全开发的读者而言,无疑会是一顿回味持久的美餐。
本人有幸把这本Java安全方面的权威书籍之中文版奉献给中国广大的Java程序员。本书所涉及的安全内容涵盖了密码学、通信保密协议、分布式安全原理、公钥基础设施(PKI)、访问控制等多方面的安全基本原理,引用到了业界许多最新的安全研究成果,并结合了现有的Java平台设计和实现的细节。要将这样庞大的知识体系进行翻译,无疑具有不小的难度,因此,翻译本书对我本人来说是一种挑战。尽管译者有多年从事安全方面开发的经验,但仍深感责任重大,时常有如履薄冰之感,所幸开发界和出版界朋友们提供了许多意见和建议,本人依据这些建议对译稿进行了数轮斟酌和修改,以求不负读者。
对于原书中的计算机新词汇和与安全相关的词汇,译文除将其译成中文之外,并一般在其后给出原词汇;而对于比较生僻难以理解的词汇,译者提供了相应的推荐译法,或者干脆不译,由读者自行体会。有争议或者具有相关背景资料的词汇,译者提供了相应的译者批注,以供有兴趣的读者参考。
本书作者之一、Sun中国研究院宫力博士曾经是Java安全子系统的首席架构师。在此非常感谢宫力博士对本书译稿提供的意见。另外,本书在翻译过程中,得到了上海CA中心冯刚、中国空间设计研究院田庄、上海交通大学陈超博士、金蝶软件公司沈奕、武汉叶俊全、JR的bruce和cherami等朋友提供的技术性意见,他们的建议和意见使得本书在语言的准确性和流畅性方面更趋完善,特在此表示感谢。
本书的出版,更应该感谢博文视点的周筠女士和方舟先生,他们凭借专业的出版经验和认真负责的态度,对本书的出版给予了全程的支持和协助,并督促我在紧张的项目中抽出时间来完善译稿的各个细节。在本译稿初稿完成后,方舟先生还特地协同我对译稿进行过多次校对,通过IM工具,他对译稿大到整体风格的整理,小到每句译句的完善,都提供了周详的意见,其对书籍的认真态度着实让我等技术从业人员感动。
尽管尽我所能,但由于本人水平所限,本书的翻译一定还存在不足之处,敬请读者批评指正。国内的原创Java社区网站JR(www.javaresearch.org)会专门设置关于本书的专栏,欢迎大家参与讨论。同时也欢迎读者通过email和我讨论,地址为:david@javaresearch.org。
朱 岱
2004年6月
于上海
Gong Li(宫力)是位于北京的Sun Microsystems工程研究院院长。在此之前,他是Java安全和网络、Java嵌入式服务器和JXTA项目的负责人。他在清华大学获得了学士和硕士学位,在剑桥大学获得了博士学位。他还是 IEEE Internet Computing 的副总编。
Gary Ellison是Sun Microsystems的资深工程师,在那里他设计了安全网络计算平台。他主要负责信任、安全和隐私保护等方面的技术。从1999年到2002年,他领导架构、设计和实现了J2SE的安全和网络组件。他从俄亥俄州立大学获得了数理学学士学位。
Mary Dageforde是一名自由职业顾问,她为硅谷的许多计算机公司撰写软件文档。她从斯坦福大学获得了计算机科学的硕士学位,她拥有软件设计和开发的背景。从1990年开始,她就专门为各种API、语言、工具和系统撰写文档。