java安全性语言

简介:
java通过所谓的 沙箱安全模型 保证了其安全性,以下我们就来看看java提供的安全沙箱机制。

组成沙箱的基本组件例如以下:
1.类装载器结构;
2.class文件检验器;
3.内置于java虚拟机(及语言)的安全特性;
4.安全管理器及java API。


一.类装载器体系结构
    1.防止恶意代码去干涉善意的代码。

         这是通过为不同类载入器提供不同的命名空间来实现的,在java虚拟机中,在同一个命名空间内的类能够直接进行交互,而不同的命名空间中类甚至不能觉察彼此的存在。除非显式地提供同意它们交互的机制。
    2.守护了被信任的类库的边界
        虚拟机通过使用不同的类装载器装载可靠的包和不可靠的包。即所谓的双亲委派模式:在某个特定的类装载器试图以经常使用方式装载类型之前,它会先默认将这个任务“委派”给它的双亲,这个双亲再依次请求自己的双亲来装载这个类型。这个委派的过程一直向上继续,直到达到启动类载入器(boostrp classloader)。假设一个类载入器的双亲类载入器有能力装载这个类型,则这个类载入器返回这个类型,否则这个类装载器试图自己来装载这个类型。
        java虚拟机仅仅把彼此訪问的特殊权限授予由同一个类装载器装载到同一个包中的类型。在同意两个类型之间对包内可见的成员(声明为受保护的或者包訪问的成员)进行訪问之前,虚拟机不但要确定这两个类型是否属于同一个包,还要确定它们属于同一个执行时包——即它们必须是由同一个类装载器装载的。

 3.将代码归入某类(称为保护域),该类确定了代码能够进行哪些操作。
二.class文件检验器
   和类载入器一起,class文件检验器保证了装载的class文件内容中有正确的内部结构,而且这些class文件相互间协调一致,假设class文件检验器在class文件里发生了问题,它将抛出异常。

好的java编译器不应该产生畸形的class文件,可是java虚拟机并不知道某个特定的class文件的来源,所以java虚拟机的实现必须有个class文件检验器,文件检验器能够调用class文件以确保这些定义的类型能够安全的使用。

    java虚拟机的class文件检验器在字节码运行之前,必须完毕大部分检验工作。class文件检验器须要经过四趟独立的扫描来完毕其工作。

第一趟扫描是在类被装载时进行的,在这次扫描中,class文件检验器检查这个class文件内部结构。以保证它能够被安全地编译。

第二和第三趟扫描是在连接过程进行的,在这两次扫描中,class文件检验器确认类型数据遵从java编程语言的语义。包括检验它所包括的全部字节码的完整性。第四趟扫描是在进行动态链接的过程中解析符号引用时进行的,在这次扫描中。class文件检验器确认被引用的类、字段以及方法确实存在。

    第一趟扫描:class文件结构检查
    对每一段被当做类型导入的字节序列。class文件检验器都会确认其是否符合class文件格式。比方是否以魔数0xCAFEBABE开头,主次版本号号所代表的的版本号是否被当前虚拟机支持等等。第一趟扫描的主要目的就是保证这个字节序列正确地定义了一个新类型,它必须遵从class文件的固定格式。这样它才干被编译成在方法区中的内部数据结构。

第二、第三和第四趟扫描是在方法区中由实现决定的数据结构上进行的。

    第二趟扫描:类型数据的语义检查
      检验一些java语言应该在编译时遵守的强制规则。比方除了Object外,全部类必须有一个父类,final类没有被子类化,常量池中的条目是合法的,并且常量池中的全部索引都指向了正确类型的常量池条目。
    第三趟扫描:字节码验证
    在这趟扫描中。java虚拟机对字节流进行数据流分析。这些字节流代表的是类的方法。它确保局部变量在赋值之前不可訪问。类的字段中总必须赋予正确类型的值等等。

    第四趟扫描:符号引用验证
    在动态链接的过程中,假设包括在一个class文件里的符号引用被解析时,class文件检验器将进行第四趟检查。在这趟检查中,java虚拟机将追踪那些引用。从被验证的class文件到被引用的class文件,确保这个引用是正确的。


三.java虚拟机中内置的安全特性
java虚拟机装载了一个类,而且对它进行了第一到第三趟的class文件检验,这些字节码就能够被执行了。

除了对符号引用的检验(class文件检查的第四趟扫描)。java虚拟机在执行字节码时

还进行了一些内置的安全机制的操作。

这些机制大多数是java类型安全的基础:

1.类型安全的引用转换。
2.结构化的内存訪问(无指针算法);
3.自己主动垃圾收集;
4.数组边界检查。
5.空引用检查。

    内置在java虚拟机中的还有一个安全特性,并未指明执行时数据空间在java虚拟机内部分布式如何的。假设查看class文件的内部,将看不到不论什么内存地址(全是符号引用和无符号数)。当java虚拟机装载一个class文件是,由它决定将这些字节码以及其它从class文件里解析得到的数据放置在内存的什么地方。当虚拟机启动一个线程时。由它决定将这个线程创建java栈放到哪里。
    最后,java虚拟机拥有异常的结构化错误处理机制。由于java虚拟机支持异常,所以当一些违反安全的行为发生时。它会做一些结构化处理。java虚拟机将抛出一个异常或者错误,而不是崩溃。
四.安全管理器和java API
安全管理器定义了沙箱的外部边界,保护虚拟机的外部资源不被虚拟机内执行的恶意或者有漏洞的代码侵犯。javaAPI在进行一个可能不安全的操作前,总是会检查安全管理器,所以javaAPI不会在安全管理器建立的安全策略下执行被禁止的操作。

详细能够參考java.lang.SecurityManager类别。


版权声明:本文博客原创文章。博客,未经同意,不得转载。







本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/4687195.html,如需转载请自行联系原作者


相关文章
|
1月前
|
安全 Java
Java 抽象类与方法:实现安全性与代码重用
在 Java 中,可以嵌套类(即类内部的类),称为内部类。嵌套类的目的是将属于一起的类分组,从而使您的代码更可读和可维护。 访问内部类 要访问内部类,请创建外部类的对象,然后创建内部类的对象:
62 0
|
1月前
|
Java 程序员 编译器
【详识JAVA语言】面向对象程序三大特性之二:继承
【详识JAVA语言】面向对象程序三大特性之二:继承
47 2
|
1月前
|
存储 Java 编译器
【详识JAVA语言】类和对象
【详识JAVA语言】类和对象
43 1
|
1月前
|
数据采集 分布式计算 大数据
Java语言在大数据处理中的应用
传统的大数据处理往往依赖于庞大的数据中心和高性能的服务器,然而随着大数据时代的到来,Java作为一种强大的编程语言正在被广泛应用于大数据处理领域。本文将探讨Java语言在大数据处理中的优势和应用,以及其在分布式计算、数据处理和系统集成等方面的重要作用。
|
1天前
|
安全 Java 大数据
探索Java的奇妙世界:语言特性与实际应用
探索Java的奇妙世界:语言特性与实际应用
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
8天前
|
前端开发 Java Go
开发语言详解(python、java、Go(Golong)。。。。)
开发语言详解(python、java、Go(Golong)。。。。)
|
8天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
148 10
|
13天前
|
Java Android开发 C++
Kotlin vs Java:选择最佳语言进行安卓开发
【4月更文挑战第13天】Java曾是安卓开发的主流语言,但Kotlin的崛起改变了这一局面。Google在2017年支持Kotlin,引发两者优劣讨论。Java以其成熟稳定、强大生态和跨平台能力占优,但代码冗长、开发效率低和语言特性过时是短板。Kotlin则以简洁语法、空安全设计和高度兼容Java脱颖而出,但社区和生态系统仍在发展中,可能存在学习曲线和性能问题。选择语言应考虑项目需求、团队熟悉度、维护性、性能和生态系统。无论选择哪种,理解其差异并适应新技术至关重要。
|
24天前
|
Java
Java语言打印九九乘法表(详解)
Java语言打印九九乘法表(详解)
15 1
Java语言打印九九乘法表(详解)