`
totoxian
  • 浏览: 1032414 次
  • 性别: Icon_minigender_2
  • 来自: 西安
文章分类
社区版块
存档分类
最新评论

从java的类装载器看安全

 
阅读更多

jave是安全的,这体现在多个方面,其中之一就是java类的加载,而且java类的加载安全机制体现出来的是一种原则,就是保持信息的单向流动而不是 杂糅的双向依赖总是一件好事,因为首先这样做会更加安全,其次这样做会降低耦合,更高层的意义上,这样做可以使得事情变得清晰明了,最后一点具有普遍性,我们的社会中的很多机构就是这么设计的。
关于java的类加载机制原理请看jvm规范,这里不再赘述。我想java类加载器中最安全的体现就在于类加载请求的逐级单向向上传递,这里的加载请求正是信息的单向流动。java之所以这么做是因为它的执行环境的复杂性,众所周知,java来自任何地方,可以到任何地方执行,这种任意的不确定性使得 java类比c++类更能体现出其整体性,c++类特性也许仅仅在开发阶段有意义,但是java类的意义却不但在开发而且在执行阶段,java虚拟机执行 的就是类,因此类必须作为一个整体传输了需要它的任何地方,既然有地方需要它,那么必然要加载它到内存,java类就好像一个货物一样,那么加载方式是任 意的吗?就好像c和c++那样载入内存就拉倒了吗?
我们想象一下卡车货运就明白了,如果任何人都可以往卡车里面装货并且在任何地方卸货,那是危险的,但是那是最危险的吗?不。因为谁有权装货谁有权卸货是另一个部门的事情,对于货物本身来说,最重要的莫过于货的内容,我们都知道上车前无论是人还是物,都要进行安检,就是这样道理,如果本来人家要的是鸡蛋,你给人家 送个,那收货的人就笑了,于是安检是很重要的一个环节,不但装货的时候要安检,卸货的时候还要安检,以确认就是收货人要的货。对于java类这种在互 联网上运输的二进制的数字货物而言,安检也是必须的,jvm实现了一套基于“委托”的类载入机制。大致意思就是一个类装载器载入的类只能主动访问相同类装载器载入的类以及该类装载器的父装载器载入的类,也就是装载一个类的时候,类装载请求逐级单向向上提交,最终第一个收到请求的是根装载器,如果根装载器不 能装载才向下沿着上来的方向回溯继续传递类装载请求,越往上类装载器的可信任级别越高,实际上,根装载器就是你的java运行环境的一部分,这种方式不能 保证事情是绝对安全的,但是最起码可以将不安全因素的比例降至最低。
我们来看一下为什么这种方式可以实现。我们想想便知,真正要执行的java类都是程序员自己写的java类,不是java环境的核心类,但是虽然是自己写 的类,它还是继承了核心类(考虑Object类),而且所有的内部逻辑不是直接继承或间接继承了核心类就是直接包含或间接包含了核心类,OO的思想无外乎 就这两种,包含和继承。核心类是最终干活的类,而我们自己写的类仅仅是一些业务逻辑的封装,最终干活的类就是一系列的工具类,我们必须确保这些核心类不被替换,确保它们的安全(想想看,它们一旦被替换,所有用到它们的都将遭殃,核心类的重用度是最高的),java规范又规定,一个类必须在它的父类初始化后才能被初始化,这样的话,核心类总是先被根装载器载入内存,java类装载器在载入一个类时,如果它已经被载入了,那么将放弃这次载入行为,这样的话,很少有机会可以替换核心类,于是实现了安全。
java类装载器的这种安全性提炼出来就是:永远保持流的单向性,然后在端点进行单点验证。有些软件就遵循这个原则,比如一个需要登录验证的软件,竟然将登录验证逻辑放到一个库当中,那么只要别人替换了你的库,安全性就不再拥有了,如果将验证逻辑防到一个端点,而这个端点在你的可控范围,那么这样既不会失 去任意插拔的灵活性,安全性也将大大加强

分享到:
评论

相关推荐

    Java类装载过程_.docx

    Java类装载过程_.docx

    Java安全中文版

    本书系《Java安全》第二版,内容涉及安全管理器、类装载器、存取控制器以及java.security包等。此外还讨论了消息摘要、证书和数字签名,并介绍了如何利用Java所提供的功能建立类签名,以及如何自行实现签名功能。...

    java类文件混合加密算法的研究与分析_邹煜.caj

    近年来,企业和java开发人员针对java类文件的...所以文章采用JNI结合类加载器装载等java技术设计了一套不透明性较大的类 文件保护机制。并分析和测试了这套类文件保护机制的有效性与可靠性。

    java api1.6

    所有被装载的class文件(包括从应用程序中和从Java API中提取的)和所有已经装载的动态库(包含本地方法)共同组成了再Java虚拟机上运行的整个程序。 在一个平台能够支持Java程序以前,必须在这个特定平台上明确地实现...

    JAVA API官方中文文档

    所有被装载的class文件(包括从应用程序中和从Java API中提取的)和所有已经装载的动态库(包含本地方法)共同组成了在Java虚拟机上运行的整个程序。 在一个平台能够支持Java程序以前,必须在这个特定平台上明确地实现...

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    1.3.2 类装载器的体系结构 1.3.3 java class文件 1.3.4 java api 1.3.5 java程序设计语言 1.4 java体系结构的代价 1.5 结论 1.6 资源页 第2章 平台无关 2.1 为什么要平台无关 2.2 java的体系...

    JAVA上百实例源码以及开源项目

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    JAVA上百实例源码以及开源项目源代码

     Java绘制图片火焰效果,源代码相关注释:前景和背景Image对象、Applet和绘制火焰的效果的Image对象、Applet和绘制火焰的效果的Graphics对象、火焰效果的线程、Applet的高度,图片到图片装载器、绘制火焰效果的X坐标...

    Java实时性及嵌入式实时Java处理器研究

    由于嵌入式系统多数为实时系统,传统Java技术应用于嵌入式系统的主要不足之处表现为:由于Java虚拟机是在运行中对引用到的类进行动态装载、解析和连接,影响了系统的实时性;垃圾收集器(GC)的自动运行导致了任务...

    深入Java虚拟机

    1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 Java程序设计语言 1.4 Java体系结构的代价 1.5 结论 1.6 资源页 第2章 平台无关 2.1 为什么要平台无关 2.2 Java的体系...

    疯狂JAVA讲义

    8.2.2 从泛型类派生子类 296 8.2.3 并不存在泛型类 298 8.3 类型通配符 298 8.3.1 使用类型通配符 300 8.3.2 设定类型通配符的上限 300 8.3.3 设定类型形参的上限 302 8.4 泛型方法 303 8.4.1 定义泛型方法 ...

    java 面试题 总结

    从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 9、...

    深入JAVA虚拟机(第2版)

    1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 Java程序设计语言 1.4 Java体系结构的代价 1.5 结论 1.6 资源页 第2章 平台无关 2.1 为什么要平台无关 2.2 Java的体系...

    深入java虚拟机第二版

    1.3.2 类装载器的体系结构 1.3.3 Java class文件 1.3.4 Java API 1.3.5 Java程序设计语言 1.4 Java体系结构的代价 1.5 结论 1.6 资源页 第2章 平台无关 2.1 为什么要平台无关 2.2 Java的体系结构对平台...

    java核心面试技术点

    JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 1说说JVM原理?内存泄露与溢出区别,何时产生内存泄露? 编译源代码为...

    java 异常总结

    当Java虚拟机或者类装载器试图实例化某个类,而找不到该类的定义时抛出该错误。 java.lang.NoSuchFieldError 域不存在错误。当应用试图访问或者修改某类的某个域,而该类的定义中没有该域的定义时抛出该错误。 java....

    java核心面试

    JVM中类的装载是由ClassLoader和它的子类来实现的,Java ClassLoader 是一个重要的Java运行时系统组件。它负责在运行时查找和装入类文件的类。 1说说JVM原理?内存泄露与溢出区别,何时产生内存泄露? 编译源代码为...

    超级有影响力霸气的Java面试题大全文档

    从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 12、...

    java 语言程序设计

    从内存的管理上加强安全性 类装载载器为安全性提供了措施 将本地的类组成一个统一空间,与外来的类地址空间分开。 运行系统中的字节码检验器

Global site tag (gtag.js) - Google Analytics