转自 “狂神说”
一、介绍Java安全模型的核心就是java沙箱sandbox,将java代码限定在jvm特定的运行范围中,并严格限制代码对本地系统资源访问,这样来保证代码的有效隔离,防止对本地系统造成破坏。
所有java程序运行都可以指定沙箱,可以定制安全策略。
java将执行程序分成本地代码和远程代码,本地代码默认可信任,远程不受信任。JDK1.0时,非授信的远程代码的安全完全依赖于沙箱机制。
如此严格的安全机制给程序扩展带来障碍,因此后续1.1版本做了改进,增加了安全策略,允许用户指定代码访问本地资源的权限。
JDK1.2再次进行了改进,增加了代码签名。不论本地代码还是远程代码,都会按照用户的安全策略设定,有类加载器加载到jvm中权限不同的空间中,来实现差异化的权限控制。
目前最新安全机制是引入了域domain。jvm会把所有代码加载到不同系统域和应用域,系统域专门负责关键资源交互,而应用域则通过系统域部分代理来对所需资源进行访问。jvm中不同的protected domain,对应不同的权限。
基本组件:字节码检验器、类装载器、存取控制器、安全管理器、安全软件包。
- 字节码校验器 bytecode verifier
确保java类文件遵循java语言规范,帮助程序实现内存保护。并不是所有类都经过字节码校验器,如核心类。 - 类加载器 class loader
双亲委派机制、安全校验等,防止恶意代码干涉。守护类库边界。 - 存取控制器 access controller
它可以控制核心API对操作系统的存取权限,控制策略可以有由用户指定。 - 安全管理器 security manager
它是核心API和系统间的主要接口,实现权限控制,比存取控制器优先级高。 - 安全软件包 secruity package
java.secruity下的类和扩展包下的类,允许用户为自己的应用增加新的安全特性。包括:安全提供者、消息摘要、数字签名、加密、鉴别等。
一般实使用ava开发服务端程序不涉及安全管理器,开发applet、app会用到。
打开安全管理器:
$ java -Djava.security.manager xxx
$ java -Djava.security.manager -DDjava.security.policy="${policypath}"
因为安全限制条件可以定制,所以还需要提供具体的安全策略文件路径,默认的策略文件路径是 JAVA_HOME/jre/lib/security/java.policy。



