Java的安全模式是其多个重要结构特点之一,它使Java成为适于网络环境的技术.因为网络提供了一条攻击连入的计算机的潜在途径,因此安全性第非常重要的.如果在一个环境中,软件可以通过网络下载并在本地运行,这个问题尤为重要.例如Java applet和Jini服务对象就是这样的例子.因为当用户浏览器中打开网页时,applet的calss文件被自动下载,很有可能用户会遇到不可靠来源的applet.同样,当一个Jini服务对象用Jini查找服务进行服务注册时,它的calss文件将从服务供应商制定的代码库进行下载.Jini实现了一个自发的网络互联,在这个网络,客户机进入一个全新的环境查找并访问本地可用服务,因此,Jini服务的客户机可能会遇到来自不可靠来源的服务对象.
Java安全模式侧重于保护终端用户免受从网络下载、来自不可靠来源的、恶意程序(以及善意程序中的BUG)的侵犯.为了达到这个目的,Java提供了一个用户可配置的"沙箱",在沙箱中可以放置不可靠的Java程序.沙箱对不可靠的活动进行了限制,程序可以在沙箱的安全边界内做任何事,但是不能进行任何跨越这些边界的举动,最初的版本1.0的沙箱对很多不可靠的Java applet的活动进行了限制,包括:
- 对本地硬盘进行的读写操作.
- 进行任何网络连接,但是不能连接到这个applet的源主机上.
- 创建新的进程.
- 装载新的动态连接库
由于下载这些代码不可能进行这些特定的操作,这就使Java安全模型可以保护终端用户免受恶意或有漏洞的代码的威胁,所以用户可以相对安全的运行不靠代码,但是对于1.0系统的程序员和用户来说,这个最初的沙箱限制太过严格,善意(但不可靠)的代码常常无法进行有效的工作,所以最初的沙箱得到了改进,引入了基于代码签名和认证的信任模式.签名和认证使得接受端系统可以确认一系列class文件(在一个JAR文件中)已经由某一实体进行了数字签名(有效,可被信赖),并且在签名后,这些class文件没有改动.这就使得终端用户和系统管理员减少了对某些代码在沙箱中的限制,但这些代码必须由团体进行数字签名.
组成Java沙箱的基本组建如下:
- 类装载器结构
- class文件检查器
- 内置于Java虚拟机(及语言)的安全特性.
- 安全管理器及Java API
- 类装载器体系结构
类装载器体系结构在三个方面对Java的沙箱起作用:
- 它防止恶意代码去干涉善意的代码
- 它守护了被信任的类库的边界
- 它将代码归入某类(称为保护域),该类确认了代码可以进行哪些操作
2.class文件检查器
- 第一趟:class文件的结构检查
- 第二趟:类型数据的语义检查
- 第三趟:字节码验证
- 第四趟:符号引用的验证
3.Java虚拟机中内置的安全特性
- 类型安全的引用转换
- 结构化的内存访问(无指针算法)
- 自动垃圾收集(不必显式地被释放分配的内存)
- 数组边界的检查
- 空引用检查