沙箱
java提供了一个用户可配置的沙箱,在沙箱中可以放置不可靠的程序,沙箱对不可靠程序的活动进行了限制
组成沙箱的基本组件
-类装载器结构
不同类装载器装入的类提供不同的命名空间,命名空间的每一个命名都被关联到方法区中的一个类型数据
类装载器连接在一个 双亲-孩子 的关系链中,正在类装载器装载类之前会委派双亲装载类型
在允许两个类型之间对包内可见的成员进行访问前,虚拟机不但要确定这两个类型属于同一个包,还必须确定它们属于同一个运行包,它们必须是由同一个类装载器装载的
启动类装载器装载核心JAVA API的class文件,这些class是可信的
-class文件检验器
保证装载的class文件内容有正确的内部结构,确定跳转指令的合法性
第一步在类装载时进行少苗,检查class的内部结构,保证可以被正确编译
第二步类型数据的语义检查,检查器查看每个组成部分,确认是否是所属类型的实例,结构是否正确
第三步字节码验证,确保采用任何路径在字节码流中都得到一个确定的操作码,确保操作数栈总是包含正确的数值以及正确地类型
第四步符号引用的验证,虚拟机将追踪那些引用,从被验证的class文件到被引用的文件,以确保这个引用是正确的,在编译时期会做验证,但是如果a引用b,当b改变时,只会对b从新编译,当使用新版本的b和老版本的a,则会不兼容,所以第四趟扫描是必须的
-内置于java虚拟机的安全特性
-安全管理器及java API
代码签名和认证
签名
A用A的私钥加密,B用A的公钥解密
加密
A用B的公钥加密,B用B的私钥解密
策略
具体安全管理器用策略文件,一个ASCII文件定义自己的定制策略,给不同的类授予权限
将 friend.jar代码在有策略文件policyfile.txt被装载后,放到一个保护域,,ProtectionDomain封装了一个到 CodeSource对象的引用以及一个到java.security.Permissions对象的引用,当类装载器将类导入方法区时,类装载器将把一 个ProtectionDomain对象的引用和class字节传递给defineClass(), defineClass方法将Friend和Friend$1所在的方法区的数据类型和被传递的ProtectDomain对象相关联
当JAVA API进行任何不安全的操作时,都会像安全管理器提出许可,JAVA API调用安全管理器的check方法,确定操作是否合法,java启动应用程序时,还没有安全管理器,应用程序通过将java.lang.SecurityManager或是子类的实例传递给setSecurityManager()来安装安全管理器
安全管理器的check方法被调用时,将请求传递给AccessController类,AccessController将调用checkPermission, 此方法决定了调用栈中的每一个帧是否有权执行潜在不安全的操作,每一个栈帧代表了由当前线程调用的某个方法,checkPermission将调用和这个线程的调用栈中的每一个栈帧相关联的ProtectionDomain对象的implies(), 传递Permisssion对象作为参数,ProtectionDomain的implies()中调用PermisssionCollection的implies(), PermisssionCollection的implies()中调用它包含的Permisssio对象的implies(),一旦某个Permission对象返回了true,向上传递,这个栈帧所代表的代码就有了执行这个潜在不安全操作的权限、
Policy.getPolicy()得到当前有效的Policy对象,再调用Policy对象的getPermisssion()方法,传入CodeSource,得到CodeSource的相应Permission对象的PermissionCollection,来判断应该给导入的代码授予什么权限。
栈检查
当存在潜在不安全操作是,调用安全管理器checkPermission方法,当AccessionController执行栈检查时,由栈顶10开始,确定相应的保护域是否包含了权限,一旦检查到无权限,抛出AccessControllerException
BPPTSTARP被赋予java.lang.AllPermission的权限
AccessController重载了四个名为doPrivileged的静态方法,如果和调用doPrivilged的方法相关联的保护域拥有执行被请求操作的权限时,AccessController将立即返回
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?