06-9-19:
安全实现:
比如在C或者C++中,利用任意的类型转换何指针的算法,我们可以很容易的突破类的封装,访问到类中的关键域。但是这个是不可能发生在Java中的。如果这些类是你的运行时环境,你可能就会觉得这是多么的重要。如果这些不可信赖的代码能够破坏到组件,比如访问你的真正的资源的组件,那么你的信用卡密码就会有可能被偷窃。
如果一个Java程序能够动态的下载代码在Internet上,然后运行在你的机密程序的旁边,保护不得不延伸得很深。Java安全模型在导入得类上封装了三层保护。在最外层,一个叫做安全管理的程序级的安全决策与一个灵活的安全策略连接。一个安全管理控制着对系统资源的访问。安全管理依靠类加载器来保护基本的系统类。一个类加载器处理加载从本地到网络的类。在最里层,所有的系统安全最终取决于Java验证器,保证来自类的完整性。(这个地方没有搞懂)
Java字节码验证器是Java运行时系统的固定部分。类加载器和安全管理程序不同可能实现不同,比如applet查看器和Web浏览器。所有的这三个部分(包括验证器、类加载器和安全管理)都需要各尽其能,才能保证Java环境的安全性。
验证器:Java的第一道防线是字节码验证器。这个验证器读取字节码,保证它有良好的行为,遵守Java语言的基本规则。一旦验证完成,就被认为是安全的,对于那些无意的或者恶意的错误。比如,验证的代码不能够伪造引用或者非法访问一个对象。它也不能执行非法的类型转换或者用无意的方法使用对象。甚至不能导致某些内部错误,比如操作数栈的溢出或者下溢。这些基础的保证位于所有的Java安全之下。
你可能比较的疑惑,这些安全不是在许多的解释型语言中实现了吗?记住这些解释型语言的保护是高层次的,然而,你不应该能够伪造一个Basic代码来破坏解释器。这些语言很有可能有一个重量级的解释器做许多的运行时工作,所以他们更加的缓慢和笨拙。
相反,Java字节码是相对轻量级的,低层次指令集。在执行前验证Java代码的能力,使得Java解释器完全高速的运行且安全,没有花费在运行时检查。这就是Java的新的地方。
这个验证器就是一种数学上的“验证定理”。它一步一步的扫描Java字节码,然后应用样本,感应规则来决定Java字节码的怎样工作的某些方面。这种分析是可能的,因为编译了的Java字节码包含了更多的信息。字节码也不得不遵守许多额外的规则来简化它的行为。首先,大多数的字节码指令操作个别的数据类型。比如栈操作,对于对象的引用有分离的指令,在Java中分别是枚举类型。相应的,也有不同的指令来移动每种类型的值到和出局部变量。
第二,对象的类型总是提前被知道。没有字节码操作能够销毁值和产生不可能产生的值作为输出。结果,总是有可能发现下一条指令和它的操作数,知道将会产生的值的类型。
因为一个操作总是产生一个知道的类型,通过查看开始的状态,总是有可能决定栈上所有的item的类型,之后局部变量在哪一点。在任何时间内的所有的类型信息集合叫做类型状态栈;这是Java试图去分析的在程序运行之前。Java不知道栈种的真实值和变量,而仅仅知道item的类型。然而,这些信息足够来加强安全规则,保证对象不会被非法的操作。
为了保证分析类型状态栈的可能性,Java放置了一个额外的限制关于Java字节码指令被执行之前:在代码中所有到相同点的路径不得不准确地到达同样的类型状态。
类加载器:负责把字节码调入解释器。类被有效的分割成不同的命名空间中。当一个加载了的类引用了另外一个类名的时候,源类加载器就会提供新的类的位置。这就意味着从一个特殊的源检索出来的类能够被限制的与从同样位置检索出来的其他的类交互。比如,一个支持Java的浏览器,能够使用一个类加载器来构建一个为所有的来自URL的加载的类提供一个分离的空间。完善的基于密码的签名的类也能够使用类加载器实现。
对于Java类的搜索总是开始于内建的Java系统类。从表明的Java解释器classpath中加载这些类。classpath中的类只加载一次,且不能够被替换。这就意味着,对于一个applet,不可能替换基本的系统类用它自己的版本,来改变他们的功能。
安全管理:负责应用层安全决策。限制对系统资源的访问的对象。比如支持Java的浏览器能够运行不受信的网络的源applets。这个浏览器的第一个动作就是下载安全管理。
在最新的Java中,安全管理与访问控制配合使用,使得你可以通过编辑安全策略文件,在一个高层次实现安全策略。
Java验证器保证了解释器不会被破坏和搅乱。类加载器保证程序使用核心Java系统类。
应用和用户层安全:
有些安全问题和用户的应用问题,我们不得不考虑。在一些解决方案中,通过询问客户okay,来决定是否进行限制。
类签名:电子签名与证书。
Java和Web:
简单得介绍了Java在Web上面得潜力。然后说了Java Web Start允许你得浏览器安全的安装软件。
为了可视化的开发环境工作得更好,你需要能够创建可复用得软件组件。那就是JavaBeans:它定义了一个方式来把软件打包,成为可服用的组装块。