Java安全体系结构

来源:互联网 发布:c语言 变量初始化顺序 编辑:程序博客网 时间:2024/05/19 04:54

原文出处:http://bbs.51cto.com/thread-970888-1.html

绪论

Java的安全好象是目前的编程语言中最优秀的一种,Java技术之所以适用于网络就是因为它有完备的、设计到其结构中的安全模式。上面我们讨论过关于类装载和命名空间等Java特有的属性,那么现在我们来看一看在实际的操作中这些特性是怎样达到安全的。
1.1
概述

Java编程语言是一种通用、并发、基于类且面向对象的语言。它非常简单,足以让许多程序员可以灵活自如地驾驭该语言。Java编程语言与CC++相关但是在组织方式上有较大的差别,Java具有CC++遗漏的许多方面,同时兼有其他语言包括的一些思想。他旨在称为一种生产语言,而不是一种研究语言。
Java编程语言是强制类型化的。清楚的区分了能够并且必须在编译时检测到的编译时的错误和那些在运行是发生的错误。编译时通常包括将程序转换成为机器无关的字节码表示。运行时活动包括加载和链接执行程序所需要的类,生成可选的机器码,动态优化存储和执行实际的程序。
Java编译语言是一种相对高级的语言,这是由于机器表示的细节无法通过语言得到。它包括自动存储管理(通常使用垃圾收集器),避免显式存储单元分配(如,CfreeC++delete)的安全问题。高性能垃圾收集的实现可以有限地中止对系统编译和实现应用的支持。该语言不包括任何非安全构造,如无索引检查的数组访问,这是由于这种非安全构造导致现在以未指定的方式工作。
Java在运行机理上和C++很相似,但是两者也有很多差异:
1Java不支持结构和指针;在C/C++中,最灵活也是最头疼的东东就是指针(一说到这个玩意我就全身发冷),但是在JAVA中,为了保持它的平台无关性,Java取消了指针。
2、自动内存管理和线索控制。在CC++,内存必须用free malloc和其它许多内存管理标准库管理。因此,系统要了解何时分配、释放内存并且跟踪所有的内存使用情况是非常困难的。如果要在CC++中实现线索功能,必须使用一个可对线索进行各种控制的类库。而在Java,尽管线索仍然需要类的支持,但系统却在语言级包括了线索同步机制。
3Java具有内嵌的内存管理程序。一旦创建了一个对象,Java的运行系统就开始跟踪这个对象,直到不再需要跟踪该对象的所有引用为止。当某个对象不存在相应的引用时,Java把这个对象放到一个用于垃圾搜集的栈内。为在性能损失最小的情况下提供自动垃圾搜集机制,这个垃圾搜集程序将在后台或作为低优先级线索运行。这样,Java的垃圾搜集软件将在前台线索的执行期间抽空执行,或者在系统显式提出需要使用那些被已经死亡的类所占用的内存空间时执行。
从后台内存管理程序可以很明显地看出,多线索的确可以增强Java环境的相对性能。鉴于多线索的重要性,Java在语言级提供了线索同步机制,使多线索成为一种内嵌特性。Java 语言支持针对方法的同步修饰符,并通过该修饰符来指明线索的运行顺序。此外,Java还能控制方法与实例变量的相互作用机制,确保了各方法之间在修改数据时不会产生冲突。
Java的内存管理和线索支持还具有使Java语言简单化的作用。正是由于把内存管理任务嵌入到了Java环境,Java语言才可以取消指针数据类型、mallocfree函数。这样,程序员就可以把更多的时间化在真正的编程工作上,而不是去跟踪调试与内存使用相关的程序错误。正是由于其多线索机制,Java才可以为一个可移植的解释系统提供较高的性能。
4Java的编译和C/C++大有不同,C/C++的编译器是将源代码编译成某种处理器所能处理的机器码,而Java编译器只是将它编译成一种临时代码,称为字节码或虚拟机代码,通过文件.class进行存储,运行时通过Java虚拟机运行,而不基于任何特定处理器。
 

1 Java虚拟机组成

Java虚拟机是一种抽象规范。在Java虚拟机中,一个虚拟机实例的行为是分别按照子系统、内存区、数据类型以及指令这几个术语来描述的。这些组成部分一起展示了抽象的虚拟机内部的抽象体系结构。但是规范中对它们的定义并非是要强制规定Java虚拟机实现内部的体系结构,更多的是为了严格地定义这些实现的外部特征。这些规范本身通过定义这些抽象的组成部分以及它们之间的交互,来定义任何Java虚拟机实现都必须遵守的行为。
从图1中我们可以看出Java虚拟机是由类装载器、运行时数据区(方法区、堆、Java栈、PC寄存器和本地方法栈)、执行引擎组成。通过本地方法接口可以与本地系统交互。


1.
Java安全模型的体系结构

Java语言拥有三大特征:平台无关性、网络移动性和安全性,而Java体系结构对这三大特征提供了强大的支持和保证,本文着重介绍Java体系结构对支持信息安全的原理和使用方法。
1.1
Java安全模型的体系结构概述

随着互联网应用越来越广泛,并且互联网其本身独特的资源共享性,因此能够按照用户需求及时准确获得信息和处理信息的应用对用户而言就相当重要,这也是Java得以迅速发展和被广泛接受的原因。但同时网络也提供了一条攻击接入计算机的潜在途径,特别是当用户下载网络软件在本地运行,这就要求Java能够对病毒/木马的问题加以防范,对信息以及本地环境进行保护。比如我们浏览一个网页的时候,网页上的Applet可能会自动下载并且运行,而这个Applet完全有可能来自不可靠的地方,又或者我们使用通过JINI服务查找到的网络上不可靠的服务对象来获得服务,如果没有Java体系结构提供的安全机制,这就很有可能引入了一个怀有敌意的程序造成信息丢失、资料泄密、相信伪造数据和修改本地计算机安全设置等等后果,带来未知的严重后果。
Java的安全平台有两部分组成:Java安全体系内核与Java加密体系(JCA)。,其中低层组件就是Java2安全平台的这两个主要部分,上层组成了安全扩展。
这三个安全扩展到Java 1.3.1才可单独获得,但是从Java1.4开始,它们就被集成为J2SE
 






3 Java安全平台

1.1
Java 2 安全体系内核

这是Java平台的一部分,它包括:字节码验证器、类加载器、安全管理器、访问控制器、访问权限管理器和策略描述工具等。下面让我们来看一下Java代码在Java安全体系内核组件中的执行过程。
首先字节码验证器检查代码是否满足Java语言规范。这个任务包含两步:
(1)字节码验证器分析字节码的顺序;
(2)字节码验证器检查对其它类的引用。例如,如果一个类要访问另一个类的方法,字节码验证器就要检查该方法是否为public.字节码验证器的典型操作包括:检查字节码的顺序是否以0XCAFEBABE开始,是否丢失字节,最后的类是否包含子类(它们不应该包括),方法的参数类型是什么等。
 


4 class文件的魔数

  如果一切正常,接下来类加载器将字节码翻译成java类,然后由java虚拟机(JVM)执行。如果需要加载一个特别的类可以定义不同的策略加以说明。通过委托给安全管理器的方式如果某个类可以访问特别的系统资源,那么类加载器和java标准类也可以定义决策权。
  安全管理器是一个可有开发人员实现的特殊类,用于指明一个类是否可以访问指定的资源(例如,文件访问或网络连接)。为了做出决策,安全管理器需要分析请求来源。如果访问被拒绝,将会抛出一个java.lang.SecurityExceptin异常,否则的话,将会以通常的方式处理该调用。
  为了增加灵活性,应用可以使用另外一个专门的机制——访问控制。Java平台提供了另外的低级安全特性如自动内存管理和强数据类型。这将会使得代码更健壮,减少了内存出错和可能的漏洞。访问权限控制是Java安全系统最重要的提高,java.security包中包含了来自java2安全体系内核的类与接口
1.1
JCA

它提供了Java平台上执行主要加密服务的基础设施,包括数字签名,信息摘要,密码,信息认证码密钥生成器和密钥生成器。同时JCA还保证了数据完整性并提供了显示全部特性的APIs

JCA是与Java安全平台相关的内建Java包的一部分,但是由于它的面向服务的特性,因此它是独立的。笼统说来,JCA仅仅是一个接口,可以有很多该接口的实现。从Java 1.4开始,Sun 微系统提供了它们自己的JCA实现,并且它完全集成到了标准Java包中。
  它支持很大范围的标准算法包括RSADSA、三重DESSHAPKCS#5RC2以及RC4.JCA是可扩展的,丰富的API可用于构建安全的应用,而其它还是算法与实现相互独立的,使用基于提供(可插拔)的体系结构。


1.2
其他体系结构

Java平台包括大量内建的工具,构成了目前广泛应用的安全服务基本集。然而,一些应用可能依赖于新出现的标准而不是已经实现的,或者依赖于所提供的服务。Java平台支持安装实现这种服务的定制工具。Java加密扩展(JCE)Java安全套接扩展(JSSE)Java认证与认证服务(JAAS)是一些主要的可插拔协作组件。


2.4.1  JCE

这是Sun微系统公司对数据块加密与解密的扩展,也是JCA实现的一部分。JCE是根据美国加密技术出口于第三方国家的条件对Java的扩展。


2.4.2  JSSE

安全套接层(SSL)已经成为应用最为广泛的通过加密保证数据完整性的数据协议。JSSE是一个标准接口和对SSL协议的实现。开发人员可以使用另外一个商业化的SSL实现,而且通用JSSE接口仍旧可以使用。最新的Java平台包含了其它的安全套接协议,如传输层安全(TLS)Kerberos和简单认证与安全层(SASL)。同时JSSE还包括SSL/TLS上的HTTPS支持。


2.4.3  JAAS

JAAS实现了基于用户认证的访问限制。和访问控制一起,它们提供了抽象的认证APIs函数,这些函数通过可插拔体系结构集成了各种登录机制。同时还提供了全面的策略与许可API,使用这些API允许开发人员创建和管理对安全敏感资源具有良好的访问控制的应用。
JAAS的一个重要特点是可以根据用户身份或代码签名实现多种认证机制单一登录服务和良好的资源访问控制。近来对于时间戳签名(始于Java5)的支持使得实施代码签名更加容易,避免了当签名证书过期时需要重签的麻烦。


2.
JAVA安全机制

安全问题对很多数人来说都非常重要。从其历史看,Java安全主要意味着虚拟机和字节码安全。然而这个看法忽略了两个重要方面—应用程序和网络安全。


2.1
沙箱刷新程序

Java安全模式的重点在于保护最终用户不受从网上下载的破坏性程序的干扰。为达到这个目的,Java提供了一个专用的运行Java程序的沙箱。Java程序在它的沙箱内可做任何事情,但出此边界就不能有任何操作。例如,未经确认的JavaApplet的沙箱禁止许多操作,其中包括:
Ø
禁止对本地磁盘的读写;
Ø
除了下载此Applet的主机外不能与任何别的主机连接;
Ø
禁止建立一个新的进程;
Ø
禁止载入一个直接调用本地方法的新的动态库。
通过限定下载代码的可执行操作的范围,Java安全模式可使用户免受破坏性程序的威胁。
Java的沙箱技术是Java安全体系结构中第一道防线。但其是有缺点的,那就是管得太多太严了。导致很多性和功能无法实现。


2.2
类载入程序体系结构

虽然名字叫类加载器,但是实际上Java虚拟机中的类加载器不光要负责加载而且要负责连接和初始化应用程序需要用到的Java类型。加载就是把二进制形式的字节码读入虚拟机中,而连接就是给这个已经读入的类型分配类变量内存以及把类型中用到常量池中的符号转换为直接引用,最后的初始化过程就是赋给类型变量合适的初始值。


3.2.1 类装载器结构

在安全沙箱中JVM的一个重要方面是其类载入程序结构。在JVM中,类载入程序负责输入那些定义运行程序的类和接口的二进制数据。在图5中只有一块被标记为“类载入程序”,但事实上,在JVM内部可能有多个类载入程序。可以说,图中的类载入程序实际代表了一个可能涉及许多类载入程序的系统。JVM有非常灵活的类载入结构,它允许Java应用程序自己定义装载类的方式。
 


图5 Java类载入程序体系结构

Java应用能用二种类载入程序:“原始的”类载入程序和类载入程序对象。原始的类载入程序(只有一个)是JVM的一部分。例如,如果JVM在某个操作系统上作为C程序被启用,那么原始的类载入程序就是那个C程序的一部分。原始的类载入程序装载获得确认的类,其中包括JavaAPI类,它们通常取自本地的硬盘。
在程序运行时Java应用装入类载入程序对象,它们能以自定义的方式载入类,例如通过网络来下载类文件。JVM认为它用原始的类载入程序装入的任何一个类都是已经确认的,不管它是否是JavaAPI的一部分。然而它对那些通过类载入对象装入的类则持另一种态度。在默认的情况下它认为它们是未获确认的。虽然原始的类载入程序是虚拟机运行的本质部分,但类载入对象不是。恰恰相反,类载入程序是用Java写的,编译成类文件,载入虚拟机中,然后象别的对象一样被实例化。实际上它们只是一个运行中的程序的部分执行代码。
因为有了类载入程序对象,在编译时你不必知道都有哪些类最终加入了Java应用程序。这样,你能在运行时动态地扩展Java应用程序。当你运行应用程序时,它能判断需要别的什么类,然后通过一个或多个类载入程序对象来装入它们。因为你是用Java编写类载入程序的,所以你能用任何方式安装类:可通过网络下载,从某些数据库中取得,甚至在乘飞机时把它算出来。
JVM对每个它所载入的类都记下了是用哪种类载入程序装入的,当一个被载入的程序引用另一个类时,虚拟机要求用同一个类载入程序装入被引入的类。如果虚拟机用某一个类载入程序装入了Volcano类,它将用同样的类载入程序来装入Volcano类引用的所有类。如果Volcano引用了一个叫Java的类,也许调用了Java类的方法,虚拟机就会向装入Volcano类的载入程序要求获得Java类。载入程序返回的Java类与Volcano类是动态链接的。
因为JVM用这种方法装载类,在默认条件下某个类只能看见用同一个类载入程序装入的其它类。Java体系结构用这种方法在单个Java应用中建立多个命名空间。命名空间是一些由特定的类载入程序装入的类的独一无二的名字集合。JVM为每个类载入程序维护一个命名空间,所有由该类载入程序装入的类的名字组成了这个命名空间。
例如:一旦某个JVM把一个叫Volcano的类装入到某一特定的命名空间后,就不能再把别一Volcano类装入那个命名空间。然而你可以把多个Volcano类装入JVM,因为你只要建立多个类载入程序就能在某个Java应用中建立多个命名空间。如果你在某个运行着的Java应用中建立了三个单独的命名空间(三个类载入程序每个载入程序一个),那么给每个命名空间装入一个Volcano类,你的应用中就有三个不同的Volcano
Java应用能使多个类载入程序对象实例化,不管它是否来自同一个类。因此它能根据需要建立多个类载入程序对象。用不同的类载入程序装入的类在不同的命名空间中,并且除非明确许可外都不能互相访问。当你开发Java应用时,你可以把从不同来源载入的类隔离到不同的命名空间中。这样用Java的类载入程序体系结构就可控制不同来源的代码间的访问,你可以防止破坏性代码的访问正常的代码。

3.2.2 “双亲委派模式”

Java虚拟机中,同一个命名空间内的类可以直接地进行交互,而不同的命名空间内的类甚至不能察觉彼此的存在,除非显式地提供了允许它们交互的机制。
一旦加载后,如果一个恶意类被赋予权限访问其他虚拟机加载的当前类,他就可以潜在地知道一些它不应该知道的信息或者干扰程序的正常运行.
 

类装载器的双亲委派模式


通常情况下,类载入程序对象都是互相依赖以完成各自遇到的类载入需求,至少它们都依赖于原始的类载入程序。例如,假设你写了个Java应用,它安装了一个通过从网上下载类文件来获取类的载入程序。假定在运行Java应用期间要求你的类载入程序装入一个叫Volcano的类。一种实现方法是,首先让原始的类载入程序在已经确认的类库中寻找并装入该类。由于Volcano不是Java API的一部分,那么原始的类载入程序就找不到它,这样你的类载入程序就会用它自定义的方式从网上下载Volcano类,假定你的类载入程序能下载Volcano类,那么它就可以在将来的应用程序的执行中发挥作用。
下面继续同一个例子,假定一段时间后Volcano类的某个方法第一次被调用,它引用了Java API中的String类,由于这是第一次调用,虚拟机要求你的类载入程序(载入Volcano的那个)装入String类。和前面一样,你的类载入程序先把要求传递给原始的类载入程序,不过这一次原始的类载入程序能直接返回String类,因为String类是很基本的类,它肯定已被用过,因此也已被装入了。大多数情况下原始的类载入程序会返回从正获确认中预先装入的String类。这样,类载入程序就不会再从网上下载它,而只是把原始的类载入程序返回的类传递给虚拟机。以后不管什么时候Volcano类要引用String 类,虚拟机都会调用已载入的这个类。


3.3 class文件检验器

class文件检验器是为了保证程序的健壮性。
class文件检验器的扫描过程:
Ø
第一趟:class文件的结构检查
Ø
第二趟:类型数据的语义检查
Ø
第三趟:字节码验证
Ø
第四趟:符号引用的验证
在第一趟扫描中,对每一段将被当作类型导入的字节序列。class文件检验器都会确认它是否符合Java class的基本结构。比如检查魔数:0xCAEFBABE。这个魔数的用处是让class文件分析器很容易检测出某个文件有明显问题而加以拒绝。所以class文件检验器第一件事就是检查导入class文件是否以0xCAEFBABE开头。
而且,在第一趟扫描中,class文件检验器必须检验确认这个class文件没有删节,尾部也没有附带其他的字节。
在第二趟扫描中,检验器查看每个组成部分,确认它们是否是其所属类型的实例,它们的结构是否正确。另外,class文件检验器检测这个类本身是否符合特定的条件,它们是由Java编程语言规定的。
在第三趟扫描中,Java虚拟机对字节流进行数据流分析,这些字节流代表的是类的方法。它是有称为操作码的单字节指令组成的序列,每一个操作码后都跟着一个或多个操作数。
在第四趟扫描中,Java虚拟机将追踪那些引用——从被验证的class文件到被引用的class文件,以确保这个引用的正确。因为第四趟扫描必须检查被检测的class文件意外的其他类,所以这次扫描可能会装载新的类。大多数Java虚拟机的实现采用了延迟装载类的策略,直到类真正地被程序使用时在装载。
在这趟扫描中Java虚拟机要执行两个基本的任务:
Ø
查找被引用的类(如果有必要就装载它);
Ø
将符号引用替换为直接引用,这样当它再次遇到相同的引用时,可以立即使用,不必再花时间解析这个引用。


3.4 Java安全机制结论

3.4.1 Java虚拟机中内置的安全特性


Java虚拟机装载了一个类,并且对它进行了第一到第三趟的class文件检验,这些字节码可以被运行了。除了对符号引用的检验(class文件检验的第四趟扫描),Java虚拟机在执行字节码是还进行其他一些内置的安全机制。
这些机制是Java虚拟机的特性:
Ø
类型安全的引用转换;
Ø
结构化的内存访问(无指针算法);
Ø
自动垃圾手机(不必显式地释放被分配的内存);
Ø
数组边界检查;
Ø
空引用检查。
Java是没有指针的,那Java虚拟机如何指明运行时的数据空间的分布呢?
运行是数据空间是指一些内存空间,Java虚拟机用这些空间来存储运行一个Java程序时所需要的数据:Java栈(每一个线程)、一个存储字节码的方法区,以及一个垃圾收集堆(它用来存储有运行的程序创建的对象)。查看class文件是无法找到内存地址的。当Java虚拟机装载一个class1文件时,由它决定这些字节码以及其他从class文件中解析得到的数据放置内存的什么地方。所以凭借class文件无法找到Java虚拟机的内存分布。
你也许会有疑问,我们说的都是在Java虚拟机中的,那程序可不可以突破虚拟机调用本地方法呢???
为此,安全管理器中包含一个方法,该方法用来确认一个程序是否能转载对于爱连接库,因为在调用本地方法时动态链接库是必需的。当线程调用本地方法时,这个线程就跳出了沙箱;因此,对于本地方法,调用本地方法前必须是确认它是安全的。


3.4.2 安全机制结论

为了发挥Java类载入程序体系结构在安全性方面的作用,程序员们必须正确使用它的上述二种功能。为利用命名空间所形成的保护,不同来源的代码应用不同的类载入程序对象来装入;为利用受信任的包得到的保护,编写的类载入程序必须对照受限制的和被禁止的包的名单来检查所需求的类的命名。
JDK1.1中,本地应用程序和正确数字化签名的applet对重要的系统资源有完全的访问权限。而未签名的applet则只能访问沙箱提供的有限的资源。安全管理器负责确定可以容许什么样的资源访问。
Java 2SDK(JDK1.2-JDK1.4)安全体系结构是基于政策的并且容许细粒度的访问控制。当代码被加载时,基于当前有效的安全政策授予相应的许可权限。许可权限和政策等新概念使得SDK提供了细粒度、高可配置、弹性以及可扩展的访问控制。这种访问控制不仅可以为applet指定,也可以为应用程序、beans servlet指定。


1.
Java反编译技术

java诞生于1995年,是一门较年轻的语言。它以平台无关性,安全性,面向对象,分布式,键壮性等特点赢得了众多程序员的青睐。特别是它简洁的面向对象的语言风格,更让许多人对它爱不释手。但人们在使用java的过程中,会发现它有几个致命的弱点:运行速度慢,用户使用不便,源代码保护机制不够安全。特别是在保护源代码方面,java是基于解释一种叫java字节码的中间代码来运行其程序的,而且jvm比计算机的微处理器要简单的多,文档也很齐全,结果造成其目标程序很容易被反编译,而且所得代码和其原始代码十分相似,甚至可以一模一样,可读性相当好。这就给java的代码保护带来了不利。


1.1
Java反编译原理

反编译是一个将目标代码转换成源代码的过程。这应该很清楚了,因为编译是一个将源代码转换成目标代码的过程。但什么是目标代码呢?大体上的定义是:目标代码是一种用语言表示的代码,这种语言能通过实机或虚拟机直接执行。对于象 C 这样的语言,目标代码通常运行在硬件 CPU 上,而 Java 目标代码通常运行在虚拟机上。
前面我们说过.class文件是有固定的格式的。Java类文件的真正二进制格式不是很重要。重要的是知道在那些字节中包含了哪些不同种类的信息。到了这一步,我们将利用多数 JDK 都带有的一个工具 -- javap javap 是一个 Java代码反汇编器,它和反编译器是不同的。
清单 1. 一个类文件的原始内容





  0000000 feca  beba 0300 2d00 4200 0008 081f 3400
  0000020 0008  073f 2c00 0007 0735 3600 0007 0737
  0000040 3800  0007 0a39 0400 1500 000a 0007 0a15
  0000060 0800  1600 000a 0008 0a17 0800 1800 0009
  ...
  

清单 2. javap 的输出结果
         
  

Local variables  for method void priv(int)

  

      Foo this  pc=0, length=35, slot=0

  

      int argument  pc=0, length=35, slot=1

  

Method void  main(java.lang.String[])

  

      0 new #4

  

      3 invokespecial #10

        6 return
  

请注意,清单 2 所示的并不是源代码。该清单的第一部分列出了方法的局部变量;第二部分是汇编代码,它也是人们可读的目标代码。

javap 被用来反汇编或解包一个类文件。这里简要列出了可以通过使用 javap 进行反汇编的 Java 类文件所包含的信息:
Ø
成员变量。每个类文件中包含了对应于该类每个数据成员的所有名称信息和类型信息。
Ø
经过反汇编后的方法。类的每一个方法都是由一串虚拟机指令来表示的,并附带它的类型签名。
Ø
行号。每个方法中的每个节被映射到源代码行,在可能的情况下,源代码行来生成节。这使得实时系统和调试器能够为在运行状态的程序提供堆栈跟踪。
Ø
局部变量名一旦方法被编译了,这个方法的局部变量就不太需要名称了,但是能通过对 javac 编译器使用 -g 选项来包含它们。这也使得实时系统和调试器能帮助您。
Ø
既然对 Java 类文件的内部情况已有所了解,让我们看一下如何能转换这些信息来达到我们的目的。




 

使用Javap命令


 



使用Java Decompiler



1.1
Java防反编译方法

虽然,大部分的代码反编译是完全正大光明的,但事实是一个优秀的反汇编器是软件侵权的必需工具之一。正因如此,尤其对于在商业和不开放源代码领域中的开发人员来说,便宜的(或免费的) Java 代码反汇编工具的存在是一个严重的问题。
就语言本身而言, 由于其相对简单的 Java 虚拟机(与真实的微处理器相比)和其写得很规范的字节码格式, Java代码非常容易反汇编。而这随着 Java 语言在 Web 开发平台上的日益普及,已经在商业开发领域引起了很多争议。
目前关于JAVA程序的加密方式不外乎JAVA混淆处理(Obfuscator)和运用ClassLoader方法进行加密处理这两种方式(其他的方式亦有,但大多是这两种的延伸和变异)。
4.2.1混淆处理关于JAVA程序的加密方式,一直以来都是以JAVA混淆处理(Obfuscator)为主。这方面的研究结果也颇多,既有混淆器(如现在大名鼎鼎的JODESUN开发的JADE),也有针对反编译器的"炸弹"(如针对反编译工具Mocha "炸弹“ CremaHoseMocha)。混淆器,从其字面上,我们就可以知道它是通过混淆处理JAVA代码,具体的说,就是更换变量名,函数名,甚至类名等方法使其反编译出来的代码变得不可理解。它的目的是:让程序无法被自动反编译,就算被反编译成功,也不容易被程序员阅读理解。
其实这只是做到了视觉上的处理,其业务逻辑却依然不变,加以耐心,仍是可以攻破的,如果用在用户身份验证等目的上,完全可以找到身份验证算法而加以突破限制。


4.2.2采用ClassLoader加密

JAVA虚拟机通过一个称为ClassLoader的对象装来载类文件的字节码,而ClassLoader是可以由JAVA程序自己来定制的。ClassLoader是如何装载类的呢?
ClassLoader根据类名在jar包中找到该类的文件,读取文件,并把它转换成一个Class对象。该方法的原理就是,对需加密的类文件我们先行采用一定的方法(可以是PGP RSA MD5等方法)进行加密处理,我们可以在读取文件之后,进行解密后,再转换成一个Class对象。


2.
总结

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

原创粉丝点击