起到第一道安全保障作用的”双亲委派类加载模型”
双亲委派方式的类加载,指的是优先从顶层启动类加载器开始,自顶向下的方式加载类的模型(参见第一条类装载器体系结构)。
这种模型的好处是,底层的类装载器装载的类无法与顶层类装载器装载的类相互调用。
哪怕是同包下的类,只要他们不属于同一类装载器,都是相互隔绝的。这对一些有安全隐患的类起到了安全隔离的作用。使它不能冒充系统类来破坏程序正常运作。
此外,不同的类装载器,也有自己的类装载范围。比如启动类装载器,它只会装在jdk/lib目录下的包/类,因此,系统级的类是相对安全的。
class文件校验器,通过四趟扫描,保证了class文件正确
第一趟是,检查class文件的结构是否正确。比较典型的就是,检查class文件是否以魔数OxCAFEBABE打头。
通过这趟检查,可以过滤掉大部分可能损坏的,或者压根就不是class的文件,来冒充装载。
第二趟是,检查它是否符合java语言特性里的编译规则。比如发现一个类的超类不是Object,就抛出异常。
第三趟是,检查字节码是否能被JVM安全的执行,而不会导致JVM崩溃。这里提到了一个停机的问题。内容是这样的,“即不可能写出一个程序,用它来判定作为其输入而读入的某个程序,是否会停机”。意思是,不可能写一个程序,让它告诉你,另外一个程序会不会中断或崩溃。
第四趟是,符号引用验证。一个类文件,它会包含它引用的其他类的全名和描述符,并跟他们建立符号引用(一种虚拟的,非物理连接的方式)。当程序第一次执行到需要符号引用的位置时,jvm会检查这个符号链接的正确性,然后建立真正的物理引用(直接引用)。
jvm类型安全特性
这些都是基础的java语言特性,他们降低了java程序出现内存混乱,崩溃的几率。
结构化内存访问(不使用指针,一定程度上让黑客无法篡改内存数据)
自动垃圾收集
数组边界检查
空引用检查
数据类型安全
Java api的安全管理器 securityManager
这是安全沙箱中,离我们程序员最接近的一环。
securityMananger,是一个api级别的,可自定义的安全策略管理器,它深入到java api中,在各处都可以见到它的身影。比如SecurityClassLoader。
默认情况下,java应用程序是不设置 securityManager 实例的(意味着不会起到安全检查),这个实例需要我们在程序启动时通过 System.setSecurityManager 来设置。
一般情况下,检查权限是,通过 SecurityManager.checkPermission(Permission perm) 来完成的。外部程序通过,创建Permission实例,传递给前面的check。
Permission是一个抽象类,需要继承它实现不同的权限验证,比如 FilePermission,代表对某个文件的读写权限。
new FilePermission(“test.txt”, “read”)
你可以将这个实例,扔给 SecurityManager,检查是否可读text.txt这个文件。
java签名/证书机制
java签名/证书机制,可以保障使用者,安全地调用外部提供的jar,防止你信任的jar被篡改。
首先,java的签名,必须是基于jar包的。也就是说,你必须将你要提供的class,打包到jar里。
然后,通过 java 提供的签名工具(jarsigner)对jar包进行签名,发布。
签名原理:
使用非对称算法,生成一对公钥/私钥。
证书
证书是在签名基础上,对签名值,再进一步做一次加密。而这次加密使用的私钥和公钥都是证书机构提供的。
这种方式,是为了防止,有些恶意用户,在公钥发到你手上前,就对其做了手脚,然后再发一个动过手脚的jar给你,用动过手脚的公钥解动过手脚的jar包,是可以解开的。
而使用证书后,它会对已经加密的签名值,再做一层加密,这样,到你手里,你只需要通过证书机构的公钥进行解密,然后再用jar包发布者的公钥解密就行了。(只能在一定程度上,提供一些安全性)
转载请注明原文链接:http://kenwublog.com/explain-java-security-sandbox
分享到:
相关推荐
7. **安全性漏洞与防范**:这种类型的攻击显示了沙箱模型的潜在弱点,即依赖于代码的不可篡改性。为了防止这类攻击,SAE应该确保关键安全类的内部状态不会被外部篡改,例如,使用不可变对象或者对敏感字段的修改进行...
9. **安全性**:Java的沙箱模型和安全类库为应用提供了安全保障。如AccessController、Permission和SecurityManager等类,用于控制代码的执行权限,防止恶意代码的运行。 10. **JavaBeans**:JavaBeans是一种可重用...
10. **安全模型**:Java的安全模型是其独特之处,通过沙箱机制防止恶意代码对系统造成损害,同时提供了安全管理器和权限类来控制代码的访问权限。 这个PDF文档很可能会深入探讨以上各点,并可能包含实例代码、最佳...
- Java 虚拟机使用“沙箱”模型来确保代码的安全性。字节码在执行前会经过类装载器和字节码验证器的检查,以防止非法操作。对于 applet 程序而言,其访问权限被严格限制,无法直接访问本地文件系统。 4. **Java...
- **安全性**:JVM通过字节码校验器和沙箱模型等机制确保程序的安全性,防止恶意代码对系统造成损害。 #### 五、Java虚拟机的架构 JVM的架构可以分为以下几个层次: 1. **应用程序(Application)**:由Java语言...
- **沙箱模型**:JavaApplet运行在受限的安全环境中,无法访问本地文件系统或网络资源,除非用户明确授权。 - **权限提升**:通过JAR签名或信任证书可以增加Applet的权限。 6. **JavaApplet的替代技术** - **...
#### 二、JVM内存模型详解 JVM内存模型主要包括以下几个部分: 1. **程序计数器(Program Counter Register)**:当前线程所执行的字节码的行号指示器。每个线程都有一个私有的程序计数器。 2. **Java虚拟机栈(Java ...
Java Applet 是一种嵌入在 HTML 页面中的小型 Java 程序,它可以在用户的 Web 浏览器上运行,提供丰富的交互性和动态功能。...通过学习 Applet,可以更好地掌握客户端与服务器的交互、安全模型以及资源管理等概念。
Java通过沙箱模型、字节码验证等机制确保了运行环境的安全。此外,Java还提供了一套完整的安全框架,用于管理权限和保护敏感资源,这对于网络应用尤为重要。 ##### 8. 网络能力 Java本身就是为网络编程而设计的。...
- **安全性**:Java提供了一系列安全机制,如沙箱模型和权限控制,以保护运行时环境不受恶意代码侵害。 - **平台独立性**:Java程序编写一次,即可在任何支持Java虚拟机(JVM)的平台上运行。 - **多线程**:Java...
Java的沙箱模型限制了程序对系统的直接访问,从而增加了安全性。 **3.2 面向对象** Java是一种完全面向对象的语言,支持封装、继承和多态等面向对象编程的核心特性。通过这些特性,Java能够更好地管理复杂的软件...
- Java的安全模型包括沙箱模型和类加载器系统等,这些都是为了保护运行环境免受恶意代码的影响。 - **1.2.3 Java的网络能力** - Java支持各种网络协议,如HTTP、FTP和TCP/IP等,这使得Java应用程序能够轻松地在...
通过严格的类型检查、沙箱机制和字节码验证等手段,Java能够有效防止许多常见的安全漏洞。 **2.3 平台独立性** Java的跨平台特性是通过Java虚拟机(JVM)实现的。无论是在Windows、Linux还是Mac OS上,只要安装了...
Java拥有强大的安全机制,如沙箱模型(sandbox model),能防止恶意代码对本地资源的访问。 **2.8 多线程** Java内置了对多线程的支持,使得开发并发程序变得非常简单。 #### 三、Java历史与发展 Java自1990年代初...