`

Java体系结构对信息安全的支持

    博客分类:
  • JAVA
阅读更多

Java语言拥有三大特征:平台无关性、网络移动性和安全性

 

Java体系结构

  首先,Java的源代码Java文件由编译器编译成Java的二进制字节码class文件

  然后,class文件由Java虚拟机中的类装载器进行加载

  最后,虚拟机中的执行引擎将class文件中的Java指令解释成具体的本地操作系统方法来执行

           而安全管理器将在执行过程中根据设置的安全策略控制指令对外部资源的访问。

 

"先编译,后解释,再执行"三步走的方式使得Java实现了"一次编写,到处运行"

 

Java体系结构对安全性的支持主要是通过以下几个方面来实现:

①Java语言本身安全性

②虚拟机的类加载器

③安全管理器

④Java提供的安全API

 

安全性体现在哪些方面:

①防止恶意程序的攻击,程序不能破坏用户计算机环境;

②防止入侵,程序不能获取主机或所在内网的保密信息;

③鉴别,验证程序提供者和使用者的身份;

④加密,对传输交换的数据进行加密,或者给持久化的数据进行加密;

⑤验证,对操作设置规则并且进行验证

 

Java语言本身安全性

语法更加简单清晰,结构、单元、运算符重载、虚拟基础类等在Java中都没有采用,取消了多重继承

   而采用实现多个接口的方式。这样能降低开发人员犯错误的几率,帮助他们写出更安全的代码

去除了C++语言中的令人费解、容易出错的"指针",用列表、堆、哈希表等结构来代替,避免了任何不安全的结构

Java也没有索引核查的数组访问

Java要求所有的变量在初始化以前不能使用,对于基本数据类型变量都会自动地赋给某个初始值

对于内存中的实体信息只能通过有权限的对象进行访问,而不会出现象C++那样把类型指针强制转换成内存的指针,

   然后通过内存查找的方法找到私有的变量

Java采用虚拟机的"垃圾回收"机制来实现的内存自动管理

对于在网络中交换的序列化对象很容易在重建对象的时候访问到对象的私有信息,这时候Java提供了两种办法来

   保护信息,一种就是采用给变量加上transient关键字的方法,这样对象序列化的时候就不会读写该变量,

   另一种就是在实现Externalizable接口而不是Serizlizable接口,这样对象就只能通过writeExternal和

   readExternal方法来保存和重建,其他方法无法进行了

---------------------------------------------------------------------------------------------------------

 

类加载器

Java虚拟机中的类加载器不光要负责加载而且要负责连接和初始化应用程序需要用到的Java类型

   加载:就是把二进制形式的字节码读入虚拟机中

   连接:就是给这个已经读入的类型分配类变量内存以及把类型中用到常量池中的符号转换为直接引用

   初始化:过程就是赋给类型变量合适的初始值

类加载器为加载的类提供了不同的命名空间

   统一源代码生成的字节码被加载到同一个命名空间中,相同命名空间不能加载类名相同的类

   同一个命名空间内的类可以直接进行交互,而不同的命名空间的类是不能交互的

类加载器分成了启动类加载器、标准扩展类加载器、路径类加载器和网络类加载器四种

   启动类加载器:从本地系统中加载原始的Java API类,用来启动Java虚拟机

   标准扩展类加载器:加载的是不同虚拟机提供商扩展的标准Java类

   路径类加载器:加载在classpath中的类

   网络类加载器:加载通过网络下载得到的类文件

每一种加载器在加载类的时候都会建立一个加载器实例。类加载器采用双亲委派链模式

   (这个模式很类似GOF在《设计模式》一书中提到的责任链模式)除了启动类加载器以外,

   每个类加载器都有自己的"双 亲"。

   一个类可以通过有三种方法定义自己的双亲

   A:通过引用,比如A类中引用了B类(即A和B有关联关系),那么B类的加载器就会作为A类的加载器的"双亲",

      早于A类加载

   B:使用loadClass方法来自定义"双亲",这时被load的类的"双亲"即本身这个类加载器

   C:在没有采用前两种的情况下使用的默认方式,默认把启动类加载器作为"双亲"。

 类加载器中还包括了一个类型检查的功能模块,它负责保证程序的健壮性,它在类型的生命周期中要进行四次检查

    A:检查是在加载的时候,主要检查二进制字节码的结构,首先格式要满足Java语言定义的规范,

       然后要保证将要加载的类字节码是一组合法的Java指令

    B:在连接的时候,主要是类型数据的语义检查,保证字节码在编译时候遵守了规范,

       比如对final类不会派生出子类,也不会重载final的方法;每个类只有一个超类;

       没有把基本数据类型强制转换成其他数据类型

    C:在连接的时候,关注于指令的结构,保证指令的操作数类型和值正确,操作数堆栈不会出现上溢出或者下溢出

    D:在动态连接的时候,主要检查类型中的符号引用被解析时是否正确

 

类加载的过程

 在加载过程中,当发出加载请求的时候,加载器首先询问它的"双亲"――路径类加载器――来查找并加载这个类,而这个加载器也向它的"双亲"请求加载,一层一层请求上去,直到启动加载器获得请求,来查找并加载这个类,如果这个类没有被加载并且查找不到,返回结果给它的子加载器,由子加载器加载,直到请求返回给原来的加载器,这时还没有加载成功的话,由网络类加载器试图从网络中寻找并下载,如果还不成功将抛出NoClassDefFoundError异常。

 

类加载的好处

   类加载器避免了出现某些怀有敌意的人编写自己的Java类,而这些类方法中含有跳转到方法之外的指令,导致虚拟机的崩溃和保密信息被获取的可能,保证了程序的健壮性,也不会出现替代原有Java API类的恶意代码被运行的情况,并且类加载器防止了恶意代码去干涉善意的代码,守护了被信任的API类库边界,确保了代码可以进行的操作。

 

-----------------------------------------------------------------------------------------------------------------------------

安全管理器

首先在赋予权限前我们要明确代码单元的来源

    A:class文件或者jar文件的签名可以用jdk中的jarsigner这个工具

    B:根据文件内容进行单向散列计算,产生一个散列值,然后把这个散列加到文件后面作为文件的一部分传递给用户,

       用户收到文件后重新生成一次散列值,然后跟文件后部的散列值进行比较

    C:如果这两个散列值相同说明文件内容没有被改动,虽然不同的文件内容可能生成相同的散列值,

        但是一般Java采用的是124位散列,这个长度想要从一个不同的输入产生一个已知散列值的计算是不可行的

    D: 仅仅通过散列值是没有办法保证代码的来源的,因为怀有恶意的人完全可以把整个文件和散列值都替换掉,

         为了防止这种事情发生,必须在发送前用私钥对散列值进行加密

    E:为什么不对整个文件进行加密呢,因为jarsigner默认采用的是DES算法,加密本身也是一个费时的过程,

       我们的目的只是为了保证文件的来源而不是文件本身的保密性,所以只需要对散列值进行加密,

       用户收到文件以后用文件提供者的公钥进行解密来验证散列值没有被替换

分配操作权限

   A:安全策略是一个java.sercurity.Policy的实现类

   B:Policy中主要包含了代码来源和相应的权限的对应关系信息,

      安全管理器的check方法将根据Policy对象判断给导入的代码赋予什么样的操作权限

   C:代码来源是由java.security.CodeSource表示的,这个对象中包含了一组Certificate对象,

       说明了为这个代码文件担保的签名

   D:权限是用java.sercurity.Permission的子类实例来表示的,

      每一个Permission有三个属性:类型、名称和可进行的操作,类型说明了权限控制的资源类型,

      比如FilePermission说明了是对文件操作的权限,名称说明了这个权限控制的对象,

      比如FilePermission的名称为"/mydoc/order.txt",说明了对文件order.txt的操作权限,

      可进行的操作属性说明了这个权限可以进行的操作,

      比如"read"说明这个FilePermission可以对order.txt进行读操作

   E:开发人员可以通过编写代码继承SecurityManager类建立自己的安全管理器来设置安全策略,

       更方便和常用的方法是通过设置策略文件来实现

---------------------------------------------------------------------------------------------

这是一个策略文件的例子:

  //从mykeys文件中获得签名的公钥

  keystore "mykeys"

  //由father签名的代码赋予读order.txt文件的权限

  grant signedBy "father"{

  permission java.io.FilePermission "order.txt","read";

  }

  //来自{Java_Home}/security/ex/目录下面的所有jar文件和class文件有读写order.txt文件的权限

  grant codeBase "file:${Java_Home}/security/ex/*"{

  permission java.io.FilePermission "order.txt","read,write";

  }

  //来自{Java_Home}/security/ex/目录下面的带有wife签名的所有jar文件和class文件有接受、连接和监听8080端口的权限

  grant signedBy "wife" codeBase "file:${Java_Home}/security/ex/*"{

  permission java.io.SocketPermission "*:8080","accept,connect,listen";

  }

  //所有代码都有读写appversion.properties文件的权限

  grant {

  permission java.io.FilePermission "appversion.properties","read,write";

  }

  如果一个应用程序没有指定启动安全管理器进行干预,它的所有操作不会受到管理器的限制,指定启动安全管理器有两种方式,一种是在运行应用程序的时候指定,一种是在代码中指定。

  java -Djava.serciruty.manager myapplication

  这里指定了启动默认安全管理器,这时候将根据Java默认的全局策略文件来设置安全策略,这个文件是

  /JAVA_HOME/lib/security/java.policy。

  java -Djava.serciruty.manager -Djava.serciruty.policy= myapplication

  这里启动安全管理器,除了默认的全局策略文件外,也会按照Djava.serciruty.policy参数指定的策略文件来设置安全策略,文件指定可以用URL也可以直接用文件名称。

  如果是在代码中指定,程序通过setSecurityManager方法设置一个java.lang.SecurityManager的实例时候,这时候安全管理器就会开始控制应用程度的操作了。这时当类加载器加载类到虚拟机的时候,安全管理器根据代码来源和签名找到相应的权限,然后建立这个类的保护域ProtectionDomain,保护域定义了这个类所有的权限。当应用程序用到这个类并要进行任何可能的不安全操作时,都会向安全管理器请求操作许可,安全管理器中有一系列的check方法来检查操作是否可行,比如checkRead方法会检查是否能够读取某个文件,checkWrite方法检查是否能够写入某个文件,管理器根据操作请求类型调用相关的check方法,check方法根据类的保护域判断操作是否可行,如果操作没有权限的话将抛出一个异常,操作收到这个异常后将不能执行,如果操作可行的话,check方法就顺利返回,操作继续执行。

  以上签名验证、定义安全策略以及安全管理器检查操作权限一系列过程,有效的保护了被Java应用使用的外部资源的安全性。要注意的是而由启动类加载器加载的核心API类是不受这个安全管理器的权限控制,这也是为什么要用类加载器防止核心API被恶意代码替换的原因。

  Java体系结构提供的安全API

  Java体系结构提供了三类主要的安全API:Java 认证和授权服务(Java Authentication and Authorization Service,JAAS)、Java 安全套接字扩展(Java Secure Socket Extension,JSSE)和 Java 加密扩展(Java Cryptography Extension,JCE)。前面已经提到了安全管理器中用到的JAAS,这一节我们提到的是API主要指Java提供的对信息进行加密的Java加密扩展包JCE和Java安全套接字扩展包JSSE, 这些API提供了加密算法可以按照我们的需要,实现对任意数据的加密和解密。

  Java加密扩展包JCE提供的是基于密钥的加密,它通过javax.crypto.Cipher类来实现数据加密合解密,加密解密的对象可以使程序中的数组对象,也可以是通过Java流接口读出或者写入的数据。使用Cipher类加密可以选择多种加密算法、加密模式和填补机制。加密算法JCE中提供了DES、多重DES、PBEWithMD5AndDES、RSA和Blowfish等等。DES是很多机构组织采用的数据加密标准;而多重DES使用多个DES密码进行多长DES加密,加大了攻击的难度但是也增加了加密解密过程说花的时间;PBEWithMD5AndDES前面提到过,主要是计算散列,然后对散列进行DES加密,来实现签名认证;RSA算法是1978年公布的一种分组加密算法,也是现在应用得最广泛的公钥密钥算法;Blowfish是由Bruce Schneier公布的一种加密算法,没有申请专利,并且公布了实现的代码,它适合不需要经常更换密钥的情况。

  选择加密模式是为了对加密数据做进一步调整,从而增加解密难度,模式还可以将分组明文作为流明文进行处理,减少每次处理的数据量,JCE中提供了电子密码本模式ECB、密码封装链接模式CBC、密码反馈模式CFB和输出反馈模式OFB。电子密码本模式ECB是最简单的一种模式,只是对明文每8个字节进行分组,并且一次完成整个明文分组的加密,它适合对二进制数据流进行加密;密码封装链接模式CBC,把一个8字节的分组作为输入数据对另一组加密结果进行修正,这样可以把明文中包含的数据类型进行隐藏,这种模式可以对文本数据进行加密;密码反馈模式CFB,类似于CBC模式只是实现稍有不同,不同的是CBC模式需要明文分组来进行修正,而CFB需要的数据量小一些,并且长度可以进行调整;输出反馈模式OFB,适合那种加密数据在传输过程中有可能产生变化的情况,产生变化出错只会对这一位产生影响而不会影响整个分组。JCE可以选择两种填补机制PCKS5Padding和NoPadding,前者将对明文进行分组时候,如果字节数不够8的倍数就进行填充,保证数据的长度为一个完整的分组,而后者不对数据进行填充,当明文进行分组时候,字节数不够8的倍数会抛出一个异常。

  Java安全套接字扩展包JSSE提供的是基于套接字之间传输的数据进行加密,它与JCE最大的不同就是数据的加密过程和传输过程是不分离的,如果说JAAS让我们可以识别应用程序提供者并限制他们只能访问授权使用的那部分系统,那么JSSE保证了我们应用程序传输的数据安全性。JSSE实现了SSL(安全套接字层)的加密,SSL作为HTTPS协议的基础,提供了在TCP套接字上对数据进行加密的方法,也是基于WEB应用最常用的一种加密方式。使用JSSE API首先我们需要建立SSL环境,SSL服务器端建立密钥库存放服务器私钥和验证身份的证书,而SSL客户端建立信任库验证信任的证书,密钥库和信任库都是通过JDK中keytool这个工具来进行管理;其次,我们需要从一个 JSSE 套接字工厂而不是直接从 java.net.Socket 类获得套接字,客户端代码从 SSLSocketFactory 获取套接字,而服务器端代码从 SSLServerSocketFactory 获取套接字;通过从这些工厂获取套接字,我们就可以利用 JSSE 提供程序提供的框架,而不是像 java.net 包允许我们所作的那样,简单地创建标准的、不安全的套接字。使用 JSSE,我们可以定义运行任意应用程序协议--包括 HTTP、TCP/IP、FTP,甚至 Telnet--的客户机与服务器之间的安全套接字连接。

  总结:

  信息的安全性是计算机领域必须重视和解决的问题,Java体系结构对信息安全的提供灵活而健壮框架,只要我们使用得当就能够很好的保证信息安全性,降低我们的代价和风险,同时我们也要加强一些其他相关的安全工作,比如保护好我们的私钥等等,这样才能保证Java安全框架发挥最大的作用。Java安全框架还有一些不足的地方,比如应用程序不断分配内存或者新建线程造成拒绝服务、将安全模型与系统用户进行映射等等,随着信息技术的不断发展,信息安全也会面临越来越大的挑战,这些都需要Java安全框架更加完善和进一步发展。

 

 

 

 

分享到:
评论

相关推荐

    详细解析Java体系结构对信息安全的支持

    Java体系结构对信息安全的提供灵活而健壮框架,只要我们使用得当就能够很好的保证信息安全性,降低我们的代价和风险,同时我们也要加强一些其他相关的安全工作,比如保护好我们的私钥等等,这样才能保证Java安全框架...

    2022年Java体系结构对信息安全的支持Java教程.docx

    2022年,Java体系结构在信息安全支持方面依然扮演着至关重要的角色。以下将详细介绍Java如何保障信息的安全。 Java 体系结构的安全性主要体现在以下几个方面: 1. **Java 字节码和虚拟机**:Java 源代码被编译成...

    Java 卡技术体系结构与程序员指南

    ### Java卡技术体系结构与程序员指南 #### 一、引言 随着信息技术的快速发展,智能卡作为一项重要的安全技术,在金融、身份验证等多个领域发挥着关键作用。Java卡技术作为一种在智能卡上运行Java应用程序的技术,...

    软件设计与体系结构ppt

    在信息技术领域,软件设计与体系结构是构建高效、可维护和可扩展软件系统的关键环节。这个PPT主题涵盖了软件工程中的核心概念,旨在帮助学习者理解和掌握如何构建软件的蓝图,以及如何有效地组织和连接各个组件,...

    Java加密体系结构.docx

    总之,Java加密体系结构为Java应用程序提供了强大而灵活的密码学支持,使得开发者能够在遵循平台无关性和安全性原则的同时,实现复杂的安全功能。无论是简单的报文摘要计算还是复杂的密钥管理和数字签名,JCA都提供...

    Java 加密体系结构 API 规范和参考

    本文档是对 Java 开发工具包 (JDK) 1.2 版中发布的 Java 加密体系结构 API 及其缺省提供者的描述和说明。描述 JCE API 的文档将...有关 JDK 安全 API 中 Java 安全体系结构方面的信息,参见“Java 安全体系结构规范”。

    Java 2 平台安全技术——结构, API 设计和实现

    Java 2平台安全技术是Java开发中的核心组成部分,它为应用程序提供了一套强大的安全机制...这本书“Java 2平台安全技术——结构, API设计和实现”将帮助读者深入理解这一领域的各个方面,是Java安全开发者的宝贵资源。

    软件体系结构

    软件体系结构是构建大型复杂软件系统的基础框架,它定义了系统的组织结构、组件以及它们之间的交互方式。在软件工程领域,良好的体系结构设计是保证软件质量、可维护性、可扩展性和性能的关键因素。C2代码是软件体系...

    java程序员技术体系

    进一步深入,Java的高级特性,如反射、泛型和注解,允许动态访问和操作类,提供类型安全和代码复用,以及元数据信息的附加。这些特性在设计模式、框架和库的实现中广泛使用。 在Java EE(企业版)领域,初级软件...

    java知识体系总结

    Java知识体系总结 Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems(现已被Oracle公司收购)于1995年推出。它以其“一次编写,到处运行”的特性闻名,适用于开发跨平台的应用程序,包括桌面应用、企业...

    Java技术:java 对安全性的支持.docx

    本文主要探讨了Java对安全性的支持,尤其是在JDK 1.2版本中的安全模型和相关机制。 首先,Java的安全性体现在其对代码的管理和执行环境。无论是本地还是远程的代码,都需要遵循一个安全策略(security policy),这...

    基于Java平台安全性的分析与研究.pdf

    JDK 1.2版本的发布,标志着Java进入了Java2时代,该版本对安全平台和安全体系结构进行了根本性的改进,为用户和开发者提供了更为安全的编程环境。 随着因特网技术的不断进步,Java技术也得到了快速的提升,Sun公司...

    java技术体系图

    - **反射**:是一种强大的工具,允许运行时动态获取类的信息并操作其结构和行为。 - **泛型**:提高了代码的复用性和安全性,使得类型检查可以在编译期完成。 - **注解**:用于向编译器或JVM提供元数据,有助于实现...

    Java技术:java对安全性的支持.pdf

    本文将详细探讨Java对安全性的支持,主要涉及以下几个关键知识点: 1. **Java安全模型**: Java的安全模型建立在一种称为“沙箱”(sandbox)的概念上,它将代码组织到不同的安全域中。每个域都有特定的权限控制,...

    关于java知识结构图

    通过"关于java知识结构图"的学习,初学者可以逐步构建起完整的Java知识体系,从基础语法到高级特性,再到实战应用,形成一个系统性的认知。在实践中不断深化理解,将理论知识转化为实际技能,才能在Java的世界里...

    Oracle11g体系结构图

    标题:“Oracle11g体系结构图” 描述:“Oracle11g体系结构图,oracle结构清清楚楚” **一、Oracle11g体系结构概览** Oracle11g是Oracle公司推出的一款高性能、高可用性和高安全性的关系型数据库管理系统。其体系...

    Postgresql之体系结构篇

    3. 官方文档:阅读PostgreSQL的官方文档是获取权威信息和深入理解体系结构的最好方式。 4. 书籍:市面上有各种关于PostgreSQL的书籍,覆盖基础知识到高级主题。 5. 网络课程和研讨会:参加在线或线下的培训课程和...

    java体系笔记

    本Java体系笔记覆盖了从基础知识到高级特性的全面内容,帮助读者建立扎实的Java知识体系,无论你是初学者还是经验丰富的开发者,都能从中受益。通过深入学习和实践,你可以掌握编写高效、稳定且易于维护的Java应用。

    Java的安全机制研究与分析

    ### Java安全机制的体系结构 Java安全架构的核心在于其设计时就充分考虑了安全因素,而不是后期添加的。这一设计思路主要体现在以下三个方面: 1. **运行方式的独特性**:Java程序的运行遵循“先编译,后解释,再...

Global site tag (gtag.js) - Google Analytics