技术头条 - 一个快速在微博传播文章的方式     搜索本站
您现在的位置首页 --> 安全 --> java 安全沙箱模型详解

java 安全沙箱模型详解

浏览:2413次  出处信息

    起到第一道安全保障作用的”双亲委派类加载模型”

    双亲委派方式的类加载,指的是优先从顶层启动类加载器开始,自顶向下的方式加载类的模型(参见第一条类装载器体系结构)。

    这种模型的好处是,底层的类装载器装载的类无法与顶层类装载器装载的类相互调用。

     哪怕是同包下的类,只要他们不属于同一类装载器,都是相互隔绝的。这对一些有安全隐患的类起到了安全隔离的作用。使它不能冒充系统类来破坏程序正常运作。

    此外,不同的类装载器,也有自己的类装载范围。比如启动类装载器,它只会装在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

建议继续学习:

  1. 腾讯执行的感悟(安全方向)    (阅读:4946)
  2. 如何让ssh登录更加安全    (阅读:4498)
  3. 公钥私钥加密解密数字证书数字签名详解    (阅读:4018)
  4. 微博架构与平台安全演讲稿    (阅读:3793)
  5. 为flash建立socket安全策略文件服务器    (阅读:3690)
  6. php.ini安全配置及使用说明    (阅读:3529)
  7. 查看你服务器的安全性    (阅读:3319)
  8. IT从业人员需要知道的安全知识(1)    (阅读:3345)
  9. 淘宝网:前端安全须知    (阅读:2951)
  10. Mysql 安全    (阅读:2761)
QQ技术交流群:445447336,欢迎加入!
扫一扫订阅我的微信号:IT技术博客大学习
© 2009 - 2024 by blogread.cn 微博:@IT技术博客大学习

京ICP备15002552号-1