当前位置: 首页 > 图灵资讯 > 技术篇> JAVA的安全结构

JAVA的安全结构

来源:图灵教育
时间:2024-02-28 17:16:57

  JAVA的安全模型不同于传统的安全方法。在传统的安全方法中,大多数操作系统允许应用程序充分访问系统资源,操作环境不能信任操作系统不提供安全保护的机器。为了弥补这一缺陷,安全策略往往要求程序员在执行应用程序之前对应用程序建立信任。例如,在执行在线应用程序之前,程序员需要检查病毒和源代码中的不安全代码。这种方法有两个问题:(1)检查程序是否安全是复杂和浪费时间。很少有程序员愿意花时间阅读程序的源代码,然后编译成本地机器代码,以确保程序的安全。(2)病毒检查应不断维护,以确保有效性。  JAVA的安全模型不同。为了防止用户系统被网络下载的不安全程序损坏,JAVA提供了一个可以在其中运行JAVA程序的定制“沙盒”。JAVA的安全模型使JAVA成为适合网络环境的技术。JAVA的安全性允许用户从Internet或Intranet上引入或运行applet。applet的行动仅限于其“沙箱”。applet可以在沙箱里做任何事情,但不能阅读或修改沙箱外的任何数据。沙箱可以禁止许多不安全程序的活动,如:  1.读写硬盘。  2.与其他主机(不包括程序所在的主机)网络连接。  3.创造新的过程。  4.加载一个新的动态库并直接调用本地方法。  “沙盒”模型的理念是在信任环境中运行不信任代码,这样即使用户不小心引入了不安全的应用程序,应用程序也不会损坏系统。

  1 “沙盒”模型

  JAVA结构内部建有“沙盒”安全模型,主要由以下部分组成:  1.JAVA虚拟机和语言的安全特性。  2.类的载入结构。  3.类文件校验器。  4.安全管理器和JAVA API。  下面分别阐述一下。

  1.1 JAVA虚拟机和语言的安全特性

  JAVA语言有一些机制,使JAVA程序非常稳定。这些机制也是JAVA虚拟机(JVM)它们的特点是:

  1.安全类型转换。在C、C++在中间,任何类型的转换都可以通过指针进行,但往往会带来不安全感。在JAVA中,应检查系统对象在运行过程中的类型相容性,以防止不安全转换。

  2.没有指针。在C和C++中,指针是最灵活、最容易出错的数据类型。指针中的内存地址操作往往会导致不可预测的错误。同时,通过指针转换内存地址的显示类型后,可以访问C++中的私人成员,从而破坏安全性,导致系统崩溃。JAVA完全控制指针,程序员不能直接操作任何指针。

  3.自动垃圾收集。程序员通过库函数malloc()和freee()来分配和释放C中的内存,C++内存是通过运算符new和delete来分配和释放的。再次释放已释放的内存块或未分配的内存块会导致系统崩溃;同样,忘记释放不再使用的内存块也会逐渐耗尽系统资源。在JAVA中,所有的数据结构都是通过运算符new来分配内存堆的对象。JAVA自动管理和收集垃圾,有效防止程序员误操作造成的错误,更好地利用系统资源。

  4.检查数组边界。如果程序中有数组访问,JVM将检查数组访问是否越界,以防止数组越界造成的错误。  5.检查null引用。如果使用的引用是null,JVM将抛出一个例外。

  1.2 类载入器结构

  类载入器结构在沙箱模型中起着重要作用。在虚拟机中,类载入器负责引入和定义运行程序的类和接口的二进制数据。虚拟机中可能有不止一个类载入器。

  JAVA程序可使用两种类型的类载入器:原始类载入器和类载入器对象。原始类载入器是JVM实现的一部分,它通常从本地硬盘载入安全类,包括JAVA API类。在运行过程中,JAVA应用程序安装类载入器对象,类载入器对象用JAVA语言编写,编译成类文件后,载入虚拟机,像其他对象一样初始化。类载入器对象用于自定义的载入类,如通过网络下载类文件。JVM认为任何通过原始类载入器载入的类都是安全的,不管这个类是否是JAVA API的一部分。将类载入器对象载入的类视为可疑,缺省时视为不安全。

  JAVA的结构可以在一个应用程序中创建多个命名空间。命名空间是由特定类载入器载入的类名的集合。JVM为每个类载入器维护一个命名空间,该命名空间包含由该类载入器载入的所有类名称。在不同的命名空间中,由不同类别的载入器载入的类别没有程序的直接允许,这些类别不能相互访问。编写程序时,不同来源的类可以放置在不同的命名空间中。这样,JAVA类载入器结构可以用来控制来源不同代码之间的相互作用,防止不安全代码访问和损坏安全代码。Applet也是如此。通过将不同来源的Applet文件放在不同的命名空间,防止不安全代码破坏安全代码。

  在“沙箱”结构中,类载入器结构是防止不安全代码的第一道墙,其作用主要有两个方面:

  1.防止访问和破坏不安全代码。

  2.防止不安全代码冒充安全类。

  这两个方面的作用是通过以下方法实现的:

  1.将代码分放在多个命名空间中,并在不同命名空间的代码之间设置“屏障”。类载入器结构是为了防止不安全代码访问和通过命名空间破坏安全代码。在载入不同命名空间的类之间设置了一个“屏障”。在JVM中,除非程序允许它们相互作用,否则同一命名空间中的类可以直接相互作用。

  2.保护可信任类库(如JAVA) API)的边界。假如类载入器载入一个类,这个类就会用它的名字假装是JAVA。 API的1部分(例如,类名为java.lang.virus),类载入器将请求传递给原类载入器。如果原类载入器不能载入此类,类载入器将抛出安全例外,并拒绝载入此类。

  1.3 类文件校验器

  每个JVM都有一个类文件校验器,以确保所载类文件具有正确的内部结构。若类文件校验器发现类文件有错误,则抛出一个例外。

  类文件校验器可以帮助检查出类是否安全。由于类文件由二进制数据组成,JVM不知道该类文件是否由黑客生成,是否可能破坏虚拟机的完整性,因此虚拟机检查引入的字节码非常重要。类文件验证器验证过程可分为两个阶段:阶段1发生在类文件验证文件的内部结构中,包括验证中包含的字节码的完整性;当字节码执行时,字节码验证器确定符号引用的类别、域和方法是否存在。

  1.3.1内部检查

  在阶段1中,类文件验证器检查类文件是否正确组成,内部是否一致,是否遵循JAVA编程语言的限制,包含的字节码是否可以由JVM安全执行。如果类文件验证器检查错误,它将抛出一个错误,类文件将不再被程序使用。

  1.检查格式和内部一致性

  在阶段1中,除了检查字节码的完整性外,校验器还检查类文件的格式和内部一致性。例如,每个类别的文件必须从相同的4字节数字0xcaFEBASE开始,这样的文件校验器可能检查的第一件事是引入的文件是否从0xcaFEBASE开始。  类文件验证器还需要验证类文件的长度是否与类文件中记录的长度一致,即验证类文件是否完整,部分是否被切断或添加。类文件校验器还需要检查类是否遵循Java语言的规定,如除Object类外,所有类都必须有一个父类。

  二、字节码校验

  一旦类文件校验器成功完成格式和内部一致性的检查,就开始校验字节码。通过对代表性方法的字节码流进行数据流分析,检查操作码是否有效,操作码是否有效,验证虚拟机是否能安全执行字节码流。

  1.3.2.引用符号的验证

  符号引用是给出引用项的名称和其他信息的字符串,足以区分分类、域或方法。符号引用的验证用于验证引用是否有效。如果引用无效(例如,如果类不能载入,或类存在,但不包含要引用的域或方法),类文件验证器将抛出一个错误。

  1.4 安全管理器和JAVA API

  安全管理器定义了“沙盒”的外部边界。类java安全管理器.lang.SecurityManager的子类是自定义的。

  JAVA 在采取某些行动时,API类通常需要安全管理器来检查该行动是否安全,包括:

  1.接受来自特定主机的socket连接。

  2.修改线程(改变线程优先级,结束线程等。).

  3.为特定主机打开socket连接。

  4.创建一个新的类载入器。

  5.删除特定文件。

  6.创造新的过程。

  7.程序退出。

  8.调用含有本地方法的动态库。

  9.等待连接。

  10.从特定的包装类别。

  11.在特定的包中加入一个新的类别。

  12.访问或修改系统特性。

  13.访问特定的系统特性。

  14.读文件。

  15.写文件。

  由于安全管理器需要在执行上述动作前进行检查,JAVA API不执行安全管理器建立的安全措施所禁止的任何行动。

  JAVA API执行一个可能不安全的活动过程,通常分为两个步骤:第一,JAVA API代码检查安全管理器是否已安装。如果没有安装,则无法进行第二步检查,则直接执行可能不安全的代码;如果安装,继续进行第二步检查,并在安全管理器中调用适当的检查方法进行动作检查。如果禁止,检查方法将抛出一个安全例外,不再执行不安全活动;如果允许,检查方法将返回,JAVA API方法继续执行动作。

  2 结束语

  安全的可靠性与成本成正比。安全的可靠性越高,为安全支付的成本就越高。因此,安全的可靠性不是越高越好。它应该相当于受保护信息的价值。计算机或网络的安全策略应该是多方面的。仅下载一个JAVA代码的“沙盒”是不够的。它还应包括人员和机器本身的安全,如机器是否有密码,员工是否是商业间谍。然而,JAVA安全模型的优点是,一旦建立,它可以为程序员做很多事情。程序员不必担心程序是否安全。JAVA的安全结构已经确定了程序是否安全。如果代码不安全,使用“沙箱”结构可以保护信息免受损坏。

上一篇:

Java远程方法调用1

下一篇:

JDBC中文处理