Java安全性编程实例(书籍及源代码)


Java安全性编程实例
目 录
第1章运行环境设置 1
1.1 J2SE的安装和设置 1
1.1.1下载J2SE 1
1.1.2安装J2SE 1
1.1.3设置J2SE 3
2.1.4 J2SE的主要工具 4
1.2反编译器的安装 5
1.3 混淆器的安装 7
第2章数据内容的保护—— 加密和解密 8
2.1一个简单的加密和解密程序——凯撒密码 8
2.2对称密钥的生成和保存 10
2.2.1对称密钥的生成及以对象序列化方式保存 11
2.2.2以字节保存对称密钥 12
2.3使用对称密钥进行加密和解密 14
2.3.1使用对称密钥进行加密 14
2.3.2使用对称密钥进行解密 17
2.4基于口令的加密和解密 19
2.4.1基于口令的加密 19
2.4.2基于口令的解密 22
2.5针对流的加密和解密 25
2.5.1针对输入流的解密和解密 25
2.5.2针对输出流的解密和解密 27
2.6加密方式的设定 30
2.6.1使用CBC方式的加密 30
2.6.2使用CBC方式的解密 33
2.7 生成非对称加密的公钥和私钥 35
2.8 使用RSA算法进行加密和解密 37
2.8.1使用RSA公钥进行加密 37
2.8.2使用RSA私钥进行解密 40
2.9 使用密钥协定创建共享密钥 42
2.9.1创建DH公钥和私钥 43
2.9.2创建共享密钥 46
第3章Java源代码和类、变量 及方法的保护 50
3.1 Java反编译及混淆器的使用 50
3.2从网络资源加载节码文件 55
3.3以任意方式加载字节码文件 60
3.4 加载加密的字节码文件 62
3.5 加载当前目录下的加密字节码文件 65
3.6 Java类、成员变量和方法的保护 69
3.6.1类的保护 69
3.6.2成员变量和方法的保护 73
3.6.3使用校验器 75
3.6.4 Reference类型私有成员变量的保护 77
3.6.5 保护常量 80
第4章 数据完整性和所有者的确认——消息摘要和签名 83
4.1使用消息摘要验证数据未被篡改 83
4.1.1计算消息摘要 84
4.1.2基于输入流的消息摘要 85
4.1.3输入流中指定内容的消息摘要 87
4.1.4基于输入流的消息摘要 89
4.2使用消息验证码 91
4.3使用数字签名确定数据的来源 93
4.3.1使用私钥进行数字签名 94
4.3.2使用公钥验证数字签名 96
4.4 使用消息摘要保存口令 98
4.4.1 使用消息摘要保存口令 99
4.4.2 使用消息摘要验证口令 100
4.4.3 攻击消息摘要保存的口令 102
4.4.4 使用加盐技术防范字典式攻击 105
4.4.5 验证加盐的口令 108
第5章 数字化身份的确定 ——数字证书 112
5.1数字证书的创建 112
5.1.1 使用默认的密钥库和算法创建数字证书 112
5.1.2 使用别名 114
5.1.3 使用指定的算法和密钥库和有效期 115
5.1.4 使用非交互模式 116
5.2数字证书的显示 117
5.2.1 使用Keytool直接从密钥库显示条目信息 117
5.2.2 使用Keytool直接从密钥库显示证书详细信息 118
5.2.3 使用Keytool将数字证书导出到文件 119
5.2.4 使用Keytool从文件中显示证书 120
5.2.5 在Windows中从文件显示证书 121
5.2.6 Java程序从证书文件读取证书 122
5.2.7 Java程序从密钥库直接读取证书 124
5.2.8 Java程序显示证书指定信息(全名/公钥/签名等) 126
5.3密钥库的维护 129
5.3.1使用Keytool删除指定条目 129
5.3.2使用Keytool修改指定条目的口令 130
5.3.3 Java程序列出密钥库所有条目 131
5.3.4 Java程序修改密钥库口令 132
5.3.5 Java程序修改密钥库条目的口令及添加条目 134
5.3.6 Java程序检验别名及删除条目 136
5.4数字证书的签发 137
5.4.1 确定CA的权威性——安装CA的证书 137
5.4.2 验证CA的权威性——显示CA的证书 141
5.4.3 Java程序签发数字证书 142
5.4.4 数字证书签名后的发布 148
5.5数字证书的检验 150
5.5.1 Java程序验证数字证书的有效期 150
5.5.2 使用Windows查看证书路径验证证书的签名 152
5.5.3 Windows中卸载证书 153
5.5.4 Java程序使用CA公钥验证已签名的证书 157
第6章 数字化身份 ——CertPath证书链 160
6.1密钥库中创建并保存证书链的几种方法 160
6.1.1 使用Keytool将已签名的数字证书导入密钥库 160
6.1.2 使用Java程序将已签名的数字证书导入密钥库 164
6.2 几种获取CertPath证书链的方法 166
6.2.1 根据证书文件生成CertPath类型的对象 167
6.2.2 从密钥库读取证书链生成CertPath类型的对象 169
6.2.3 从HTTPS服务器获取证书链 171
6.3 CertPath对象的证书显示和保存 178
6.3.1 显示CertPath中的证书 178
6.3.2 保存CertPath中的证书 180
6.4 验证CertPath证书链 182
6.4.1 验证主体和签发者 183
6.4.2 验证签名 185
6.4.3 CertPathValidator类基于TrustAnchor验证证书链 187
6.4.4 CertPathValidator类基于密钥库验证证书链 191
6.5 使用CertStore对象保存和提取证书 195
6.5.1创建CertStore对象 195
6.5.2定义证书的选择标准 199
6.5.3从CertStore中提取证书 202
6.6 证书的吊销 204
6.6.1查看证书吊销清单常规信息 204
6.6.2查看清单中被吊销的证书 210
6.6.3从CertStore对象中提取已吊销的证书 212
第7章 数据的安全传输和身份验证 ——SSL和HTTPS编程 217
7.1 最简单的SSL通信 217
7.1.1 最简单的SSL服务器 217
7.1.2 最简单的SSL客户程序 219
7.1.3 进一步设置信任关系 222
7.1.4 设置默认信任密钥库 223
7.1.5 通过KeyStore对象选择密钥库 226
7.2 进一步的SSL客户和服务器程序的例子 228
7.2.1 设计通信规则 228
7.2.2 查看对方的证书等连接信息 233
7.3 HTTPS客户及服务器程序 237
7.3.1 最简单的HTTPS服务器程序 237
7.3.2 最简单的HTTPS客户程序 244
7.3.3 基于Socket的HTTPS客户程序 247
7.3.4 传输实际文件 249
7.4基于证书的客户身份验证 253
7.4.1 最简单的验证客户身份的HTTPS服务器程序 253
7.4.2 编写客户程序连结需客户验证的HTTPS服务器 256
第8章 程序运行的安全性 ——基于代码来源的授权 258
8.1 安全管理器的使用 258
8.1.1使用默认的安全管理器限制应用程序 258
8.1.2编写自己的安全管理器 261
8.1.3在程序中设置安全管理器 264
8.2使用策略文件基于代码位置进行授权 265
8.2.1允许所有代码具有所有权限 265
8.2.2允许所有代码具有特定的权限 270
8.2.3许所有代码具有多种不同权限 272
8.2.4针对指定目录中的代码的授权 274
8.2.5针对从网络下载的代码的授权 279
8.3使用策略文件基于代码的所有者进行授权 283
8.3.1编程者对代码进行签名 283
8.3.2用户检验已签名的代码 284
8.3.3针对签名者进行授权 286
8.4定义特权代码 289
8.4.1 不同代码之间的调用和授权 289
8.4.2 使用doPrivileged( )方法定义特权代码 294
8.4.3 使用匿名类定义特权代码 298
8.5权限的操作及定义自己的权限 302
8.5.1 策略文件权限的检测 303
8.5.2 最简单的权限定义 306
8.5.3 使用签名的权限 310
8.6 Applet的安全运行 312
8.6.1 使用AppletViewer运行的Java Applet 312
8.6.2 浏览器中使用Java Plug-in运行Java Applet 315
8.6.3 浏览器基于策略文件运行Java Applet 321
8.6.4 浏览器运行RSA签名的Java Applet 323
8.6.5 Java Plug-in的证书管理 328
8.6.6 使用usePolicy权限加强RSA签名Applet的安全控制 330
第9章 程序运行的安全性—— 基于用户身份的验证和授权(JAAS) 333
9.1 最简单的身份验证 333
9.1.1最简单的登录 333
9.1.2更换登录模块修改验证方式 337
9.1.3更换回调处理器修改登录界面 339
9.1.4使用非交互式验证 340
9.2编写自己的登录模块 343
9.2.1简单的登录模块 343
9.2.2完整的登录模块模板 351
9.2.3使用模板编写自己的密钥库登录模块 359
9.3使用堆叠式登录 367
9.3.1堆叠式登录及各个登录模块的相互关系 367
9.3.2堆叠登录模块之间的信息共享 371
9.4编写自己的回调处理器 387
9.4.1最简单的回调处理器 387
9.4.2 图形界面口令输入的安全性 393
9.4.3文本界面口令输入的安全性 395
9.4.4 更加安全的文本界面口令输入方式 397
9.5基于身份的授权 400
9.5.1使用策略文件的基于身份授权 400
9.5.2使用编程方式的基于身份授权 406
9.5.3 比较doAsPrivileged( )和doAs( ) 410


本书共分9章,主要内容如下:
第一章
解决的主要问题
运行本书的程序需要哪些软件?
主要内容
介绍本书所使用的主要软件及其安装和配置
第二章
解决的主要问题——内容的安全性
数据在网上传递怎么样防止被黑客窃取听到?
硬盘上的文件中有敏感数据,如何防止被黑客看到?
主要内容
本章解决的是数据内容的安全性,介绍Java的加密和解密技术。学完该章可以通过Java编程对各种数据进行各种形式的加密。密码学也是安全机制的基础。
第三章
解决的主要问题——和源代码相关的安全性
编写好的程序给用户后,用户如果能反编译出源代码怎么办?
定义类、成员变量、方法时如何防止恶意或无意的攻击?
主要内容
本章解决的是和源代码相关的保护。包括源代码、类、成员变量、方法的保护。通过常用的反编译工具加强对源代码保护的认识,使用混淆器和加密等方式对源代码作了初步保护。同时演示了编写程序时如何考虑攻击者对类、成员变量、方法等方面的攻击。
第四章
解决的主要问题——确定数据的完整性和所有者
网上下载了一个程序,如何确定它确实是某某公司开发的?
如何确定黑客没有将程序修改过?
某公司或人发来一个文件,后来他不承认发过这个文件怎么办?
主要内容
第四章起开始介绍和身份认证相关的技术。包括身份确定性、不可篡改性、不可否认性等,该章介绍的消息摘要和签名技术可解决这些问题。
第五章、第六章
解决的主要问题——数字化身份的凭证
实际应用中如何方便地使用摘要和签名技术?
如何确定某个签名确实是某个人或机构的?
主要内容
第五章和第六章介绍基于摘要和签名技术的数字证书。这是Java安全中确定身份的主要技术。其中第五章介绍了数字证书的创建、签发、验证和维护等,第六章介绍了多个证书组成的证书链(CertPath)的创建和验证。
第七章
解决的主要问题——数据安全传输,服务器和用户身份的确定
客户机和服务器之间的通信如何自动进行加密传输?
客户机和服务器之间的通信如何相互确定身份?
浏览器访问一个站点,如何确定这个站点不是黑客的服务器?
主要内容
本章介绍介绍使用加密技术和证书机制的一个实际应用,基于SSL和HTTPS的编程。学完本章可以编写自己的SSL和HTTPS客户及服务器程序。
第八章
解决的主要问题——基于代码来源的程序的安全运行
网上下载了一个程序,运行时会不会删除我的文件,或将某些文件泄漏给黑客?
编写了一个Java Applet,如何让其能访问硬盘上的文件?
主要内容
本章介绍基于代码来源的程序的安全运行,可以基于运行时代码在哪个URL、或代码是谁签名的限制其可以访问哪些用户资源。还介绍了定义自己的权限以及签名Java Applet。
第九章
解决的主要问题——身份验证和基于执行者身份的程序的安全运行
程序需要用户输入账号和口令到数据库登录,但以后可能需要改为智能卡验证。
程序需要访问某个用户资源,但只有用户以某些特殊身份登录时才需要该权限。
主要内容
本章介绍Java验证和授权服务(JAAS),可以方便地更换验证模块,并实现基于身份的授权。

你可能感兴趣的:(JAVA安全)