2.2.4 安全模型
J2SE现有的安全系统太庞大,不能够适应CLDC目标平台的约束;单单是它就可能用掉了所有可用的内存。一个改进的版本削减了许多特性,仅需要特别少的资源。好消息是这个简化使得它很容易覆盖所有细节。
CLDC的安全模型有两个部分:虚拟机安全和应用程序安全。
笔者知道安全性不是一个让人感兴趣的主题,但是建议各位读者花点时间通读一下这个部分。这个为CLDC修改的版本中,有一些为后面讨论的程序执行模型而设立的重要基础工作。
1.虚拟机安全
虚拟机安全层的目的是保护下面的设备不受任何执行代码可能引起的损害。在通常的情况下,一个字节码校验过程在任何代码执行前进行。这个确认过程实质上是验证类文件的字节码,从而确保它可以正确执行。这个过程最重要的结果是保护它抵御不合法指令的执行——或者更糟的情况,比如Java环境之外的内存崩溃。
在J2ME中标准字节码校验过程需要大概50KB的代码空间,同时还要高达100KB的堆空间,这在大型系统中是可以被忽略的。但是这几乎是许多小型设备上Java可用的所有内存。尽管笔者有强烈的愿望想用尽所有的资源来做程序的校验,但是一些人坚持要更多的东西,如任何形式的程序。所以为了平息这些要求,CLDC规范提供了一个替代品。
结果是,CLDC虚拟机中的验证实现需要大概10KB的二进制代码空间和小到100B的运行时内存空间。从动态内存的观点,这是减少了1000倍。
这种资源的减少,实质上是去掉了内存中校验过程的交互式数据流算法。代价是现在我们必须要承受一个被称为预校验的额外步骤来为KVM上的执行准备代码。这个过程的结果是在类文件中插入额外的属性。
注意:即使经过了预校验过程,转换后的类文件仍然是合法的Java字节码;校验器自动忽略这些额外的数据。惟一值得注意的区别是得到的文件比原来的大约大5%。
J2ME开发环境提供一个工具来执行预校验过程。这个过程并不复杂,正如在图2.4中看到的那样。重要的一点是那个验证过程是在PC上执行的。

图2.4 预校验过程降低了传统类文件校验所需要的资源
注意:为了避免混淆,验证过的类文件通常被称为pclasses。
2.应用程序安全
前面讨论的类装载器验证过程是很有限的。基本上,它只是校验哪个字节码是Java编译过程的合法结果。尽管这是有帮助的,但仍然需要一个更高层次上的安全来保护设备的资源。
就像我们可能猜到的,功能强(但是也相当大)的J2SE安全模型是不能采用的。CLDC基于沙箱的概念提出一个简化的安全模型。
沙箱这个术语的意思是Java代码只能在一个小的、受控的环境中运行。即使我们热爱的蓝色大货车就停在外边,而且确实想跟它一块玩,但是我们不能。外边的任何东西都是完全禁止的,所以要停止尝试。
注意:如果读者已经做过任何Java小程序(在Web浏览器中运行的Java程序),那就应该已经熟悉沙箱安全概念了。CLDC的实现是非常类似的。
正如在图2.5中看到的,Java代码已经被局限在沙箱里了。CLDC定义了确切可以执行的列表,那是所有能用的东西。保护仍然起作用,所以不可以改变基类,就是那些构成被称为核心类的设备上安装的API。CLDC强制保护这些类。

图2.5 Java的沙箱安全模型在保护下层设备的同时提供给访问核心类的能力






