Java 安全性编程概念
1. Java 平台是如何使安全编程更方便的
2. 什么是安全编程技术?
3. JDK 1.4 中集成了安全性
4. 第三方库充实了安全性
5. 展望
Java 平台是如何使安全编程更方便的 |
Java 编程语言和环境有许多特性使安全编程更方便:
- 无指针,这意味着 Java 程序不能对地址空间中的任意内存位置寻址。
- 字节码验证器,在编译成 .class 文件之后运行,在执行之前检查安全性问题。例如,访问超出数组大小的数组元素的尝试将被拒绝。因为缓冲区溢出攻击是造成大多数系统漏洞的主要原因,所以这是一种重要的安全性特性。
- 对资源访问的细颗粒度控制,用于 applet 和应用程序。例如,可以限制 applet 对磁盘空间的读或写,或者可以授权它仅从特定目录读数据。可以根据对代码签名的人以及代码来源处的 http 地址来进行授权。这些设置都出现在 java.policy 文件中。
- 大量库函数,这些函数用于主要密码构件和 SSL(本教程的主题)以及认证和授权(在本系列的第二篇教程中讨论)。此外,有众多的第三方库可用于额外的算法。
什么是安全编程技术? |
简单地说,有多种编程风格和技术可以帮助确保应用程序更安全。考虑下列两个一般示例:
- 存储/删除密码。如果密码是存储在 Java String 对象中的,则直到对它进行垃圾收集或进程终止之前,密码会一直驻留在内存中。即使进行了垃圾收集,它仍会存在于空闲内存堆中,直到重用该内存空间为止。密码 String 在内存中驻留得越久,遭到窃听的危险性就越大。
更糟的是,如果实际内存减少,则操作系统会将这个密码 String 换页调度到磁盘的交换空间,因此容易遭受磁盘块窃听攻击。
为了将这种泄密的可能性降至最低(但不是消除),您应该将密码存储在 char 数组中,并在使用后对其置零。(String 是不可变的,所以无法对其置零。) - 智能序列化。当为存储器或传输任何私有字段而序列化对象时,缺省情况下,这些对象都呈现在流中。因此,敏感数据很容易被窃听。可以使用 transient 关键字来标记属性,这样在流中将忽略该属性。
当在本教程中需要用到这些技术以及其它技术时,我们将更详细地讨论它们。
JDK 1.4 中集成了安全性 |
在 JDK 1.4 之前,许多安全性功能必须作为扩展添加到基本 Java 代码分发版中。严格的美国出口限制要求这种功能的分离。
现在,新的宽松法规使安全性特性和基本语言更紧密的集成成为可能。下列软件包(在 1.4 发行版之前作为扩展使用)现在集成到了 JDK 1.4 中:
- JCE(Java 密码术扩展)
- JSSE(Java 安全套接字扩展)
- JAAS(Java 认证和授权服务)
JDK 1.4 还引入了两种新功能:
- JGSS(Java 通用安全性服务 (Java General Security Service))
- CertPath API(Java 证书路径 API (Java Certification Path API))
第三方库充实了安全性 |
· 我们可以用第三方库(也称为提供程序)来增强当前 Java 语言中已经很丰富的功能集。提供程序添加了额外的安全性算法。
· 作为库示例,我们将使用 Bouncy Castle 提供程序。Bouncy Castle 库提供了其它密码算法,包括本教程什么是公钥密码术?和什么是数字签名?中讨论的流行的 RSA 算法。
· 尽管您的目录名和 java.security 文件可能有一点不同,但仍可用以下模板安装 Bouncy Castle 提供程序。要安装这个库,请下载 bcprov-jdk14-112.jar 文件并将它放到 j2sdk1.4.0\jre\lib\ext 和 Program Files\Java\J2re1.4.0\lib\ext 目录中。在两个 java.security 文件(他们位于上述相同的目录下,但位于“security”子目录而不是“ext”)中,将下面的行:
·
· security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider
·
· 添加至这些行的末尾:
·
· security.provider.1=sun.security.provider.Sun
· security.provider.2=com.sun.net.ssl.internal.ssl.Provider
· security.provider.3=com.sun.rsajca.Provider
· security.provider.4=com.sun.crypto.provider.SunJCE
· security.provider.5=sun.security.jgss.SunProvider
· security.provider.6=org.bouncycastle.jce.provider.BouncyCastleProvider
展望 |
在本章中,我们已经介绍了 Java 语言提供的有助于确保编程保持安全的特性(无论是完全集成的还是基于扩展的)。我们提供了一些安全编程技术的通用示例以帮助您熟悉这个概念。我们介绍了过去是作为扩展的但现在集成到版本 1.4 发行版中的安全性技术;我们也注意到两种新的安全性技术。我们还说明了了第三方库通过提供新技术能够增强安全性程序。
在本教程余下的部分,我们将让您熟悉这些旨在提供安全的消息传递的概念(因为它们应用于 Java 编程):
- 消息摘要。这是一种与消息认证码结合使用以确保消息完整性的技术。
- 私钥加密。被设计用来确保消息机密性的技术。
- 公钥加密。允许通信双方不必事先协商秘钥即可共享秘密消息的技术。
- 数字签名。证明另一方的消息确定来自正确通信方的位模式。
- 数字证书。通过让第三方认证机构认证消息,向数字签名添加另一级别安全性的技术。
- 代码签名。由可信的实体将签名嵌入被传递的代码中的概念。
- SSL/TLS。在客户机和服务器之间建立安全通信通道的协议。传输层安全性(Transport Layer Security (TLS))是安全套接字层(Secure Sockets Layer (SSL))的替代品。
当我们讨论上述每个主题时,都将提供示例和样本代码。