java 安全沙箱模型详解
起到第一道安全保障作用的”双亲委派类加载模型”
双亲委派方式的类加载,指的是优先从顶层启动类加载器开始,自顶向下的方式加载类的模型(参见第一条类装载器体系结构)。
这种模型的好处是,底层的类装载器装载的类无法与顶层类装载器装载的类相互调用。
哪怕是同包下的类,只要他们不属于同一类装载器,都是相互隔绝的。这对一些有安全隐患的类起到了安全隔离的作用。使它不能冒充系统类来破坏程序正常运作。
此外,不同的类装载器,也有自己的类装载范围。比如启动类装载器,它只会装在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包发布者的公钥解密就行了。(只能在一定程度上,提供一些安全性)
本文来源于"阿里中间件团队播客",原文发表时间"2011-03-15 "
Java笔记之线程消费者模型 1.通过这个模型 成功的演示出了 线程安全的问题 两个消费者 同时访问同一个仓库对象 仓库内只有一个元素的时候 两个消费者并发访问 会有可能产生抢夺资源的问题 2.自己解决一下线程安全的问题 让仓库对象被线程访问的时候 仓库对象被锁定 仓库对象只能被一个线程访问 其他的线程处于等待状态 特征修饰符 synchronized 同步 一个时间点只有一个线程访问 线程安全锁 两种形式写法 1.将synchronized关键字 放在方法的结构上 public synchronized void get(){} 锁定的是调用
相关文章
- Java 开发环境配置--eclipse工具进行java开发
- java基础知识回顾之java Thread类学习(五)--java多线程安全问题(锁)同步的前提
- java基础知识回顾之java Thread类学习(四)--java多线程安全问题(锁)
- 【Java】java扩展机制SPI 实现
- Java实现 LeetCode 784 字母大小写全排列(DFS)
- Java实现 LeetCode 700 二叉搜索树中的搜索(遍历树)
- Java实现第八届蓝桥杯图形排版
- java实现奇怪的比赛
- java数组随机排序实现代码
- 《阿里巴巴Java开发手册》最新中文版PDF电子版下载
- 【JAVA】 04-Java中的多线程
- [JavaEE] Testing the Java EE Application : Basic Arquillian integration test
- [Linux] Install java and add JAVA_HOME, PATH
- java 11 Java Flight Recorder
- 【JAVA】MacBook安装Java环境及eclipse
- java集合框架02——Collection架构与源码分析
- Gradle在大型Java项目上的应用
- 关于Java多态的一道面试题(多态有没有彻底掌握,就看这道题了!)
- 浅析Java各种变量线程安全问题
- java web 拦截器、过滤器理解
- 华为OD机试 - 数组去重和排序(Java & JS & Python)
- Jackson将Java对象转为json【或者】将json转为Java对象
- 从源头开始学习 Java 单例模式:线程安全和性能的双重保障
- 【华为OD机试 2023】快递业务站(C++ Java JavaScript Python)
- 【Java】java 性能监控及工具
- 详解jvm之java类加载机制和类加载器(ClassLoader) 深入理解Java类加载器(ClassLoader) 如何自定义类加载器 深入说明双亲委派 双亲委派模型的破坏者-线程上下文类加载器
- java通过代码控制线程状态,解决线程不安全的问题。
- 一致性 Hash 算法 及Java 实现
- java-mybaits-013-mybatis-Interceptor-拦截器执行顺序
- java.lang.OutOfMemoryError: Java heap space
- 【java】Java并发编程系列- volatile关键字(高并发中特实用哦)
- Java中保证线程安全的三板斧
- JAVA开发讲义(一)-Java的自白