Java虚拟机之 网络安全

Java提供可配置的沙箱来限制代码的行为

 1、类加载器

    不同的applet程序使用不同的类加载器,不能相互访问;

    双亲委派模式:每个类加载器都直接或间接继承启动类加载器,子加载器加载一个类时会默认的调用父加载器进行加载,保证Java api类都是由启动类加载器加载的安全的类;

    运行时包概念:子加载器加载的类即使与父加载器加载的类包名一样也处于不同包,受到跨包访问限制;

2、class文件检验器

  第一步 class文件结构检查:

 检查文件是否是符合规定的字节码文件(以特定的字符串开头、声明主版本号与次版本号,该版本在本虚拟机可支持范围内)、文件的完整性。   第一步直接扫描class文件,二、三、四步是将类加载到内存中检验

第二步 类型数据的语义检查

  定义语句是否正确:变量与方法的定义是否符合语法规范(出现新的内并不会在这一步装载),是否继承了object类:是否添加了object中的方法。

第三步 字节码验证

 检查方法 确保变量是正确的类型,正确的值,在被访问前拥有合适的值,使用运算符符合规范,没有明显的停机错误(无返回值,永真的循环..)

第四步 符号引用的验证

如果预先加载 :第四步紧跟第三步执行,装载相关引用类。现在大部分是热加载:当字节码文件第一次被执行时加载引用类,判断是否能够加载,是否有当前需要的变量然后再将引用替换为对应的指针或偏移量。

3、Java虚拟机内置的安全特性

  1、类型安全的引用转换

  2、结构化的内存访问(无指针算法)

  3、自动的垃圾收集(没有显式的释放内存)

  4、数组边界检查

  5、空引用检查

  异常处理机制:程序出现了一个未捕获的异常只会终止当前线程而不是整个程序崩溃

   另外一个内置的安全管理器能够识别(可配置)当前程序是否能够装载动态连接库,在调用本地方法(不管是自定义的还是Java Api的本地方法)都需要装载动态连接库

4 、安全管理器与Java Api

  安全管理器定义了沙箱的边界,当Java Api执行任何可能不安全的操作时都会调用安全管理器对应的check方法(checkread、checkwrite)来确定是否拥有权限,安全管理器可由程序自定义、也可以选择不要

5、代码签名和认证

   提供代码的组织或机构在自己的代码的后面签名进行担保:将代码组成的jar包进行散列得到一串字符,在用私钥进行加密,将加密后的字符串添加到jar包结尾

  用户在下载jar包后 将jar包后的字符串用机构提供的公钥进行解密,将jar包进行散列的到散列字符串,如果解密后的字符串与自己散列得到的字符串一样代表该jar包是提供担保组织发布的未被恶意修改的代码(私钥与公钥如何设计我不了解)

jvm可以为每个担保者的代码提供单独的沙箱,执行不同的安全策略

6、策略

  与代码签名共同作用,为不同的代码建立更加细粒度的权限控制

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章