zoukankan      html  css  js  c++  java
  • JAVA 密码技术基础(第一部分)

    Java 安全性编程概念
    clip_image001 1. Java 平台是如何使安全编程更方便的
    clip_image001[1] 2. 什么是安全编程技术?
    clip_image001[2] 3. JDK 1.4 中集成了安全性
    clip_image001[3] 4. 第三方库充实了安全性
    clip_image001[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))的替代品。

    当我们讨论上述每个主题时,都将提供示例和样本代码。

  • 相关阅读:
    301重定向的代码
    小问题,小细节要注意(string类型转换为bool类型)
    关于添加网站适配的问题解决
    this.Page.Request.ServerVariables
    将一个字段的两个数据分开读取
    使用distinct出现的一个问题
    什么是集合是只读的?
    编辑完这一条数据如何继续转入下一条数据(快速编辑)
    系统信息相关命令
    用户权限相关命令
  • 原文地址:https://www.cnblogs.com/chinareny2k/p/1676238.html
Copyright © 2011-2022 走看看