Java高级特性——安全
Java高级特性——安全
Java技术提供了三种确保安全的机制:
- 语言设计特性(对数组的边界进行检查,无不受检查的类型转换,无指针算法)
- 访问控制机制,用于控制代码能够执行的操作
- 代码签名
一、类加载器
1. 类加载器介绍
类加载器可以在将类加载到虚拟机的时候检查类的完整性。
类加载器主要有三种:引导类加载器、平台类加载器、系统类加载器
- 引导类加载器负责加载大量的 JDK 内部模块的平台类,如 StringBuilder、StringBuffer等。
- 系统类加载器会从模块路径和类路径中加载应用类
2. 类加载器的层次结构
除引导类加载器外,其他的类加载器都有其父类加载器,层次结构如下图。根据规定,类加载器会为其父类加载器提供一个机会,以便加载任何给定的类。也就是说,当通过系统类加载器加载一个类 StringBuilder 时,它首先要求平台类加载器进行加载,而平台类加载器要求引导类加载器进行加载,如引导类加载器找到了这个类,那么它会加载这个类,而无需其他类加载器进行更多的搜索。
注:引导类加载器没有对应的 ClassLoader 对象
注:java9 之前可以通过反射机制访问受保护的URLClassLoader.addURLs 方法来加载 jar 包,但是现在无法这样操作了
3. 自定义类加载器
自定义类加载器继承 ClassLoader 类,实现其 findClass 方法即可。
4. 字节码校验
类加载器将字节码序列加载到虚拟机时,这些字节码首先要接受校验器的校验。校验器负责检查是否存在明显的有破坏性的指令。
检查项包括:
- 变量要在使用之前进行初始化
- 方法调用与对象引用类型之间要匹配
- 访问私有数据和方法的规则没有被违背
- 对本地变量的访问都落在运行时堆栈内
- 运行时堆栈没有溢出
注:可以通过虚拟机启动参数来关闭校验:java -noverify xxx
二、安全管理器与访问权限
注:Java 程序默认不开启安全管理器
1. 开启安全管理器
有两种方式可以开启安全管理器:
- 通过启动参数(推荐):
java -Djava.security.manager -Djava.security.policy==xxx.policy xxx
- 在主程序中设置:
System.setSecurityManager(new SecurityManager());
通过启动参数开启或者在主程序中设置时都可以选择指定策略文件,如果不指定,则使用默认的策略文件(位于 JDK 目录下的 conf/security 文件夹地下)
策略文件也可以通过代码指定(需在开启安全管理器之前指定),如下:
一般来说,最好通过启动参数的方式来开启安全管理器和设置策略文件。
2. 安全策略文件
基本格式
代码来源格式为:codeBase "file:///xxx/xxx.jar"
例子:
权限类型可参阅 java.security.permission
类的实现类。
3. 自定义权限
注:如果使用了 Java 平台模块,那么需要在 module-info.java 文件中导出自定义权限类所在的包,否则不生效
除了 JDK 提供的权限类之外,我们也可以自定义权限类。
(1)创建权限类
(2)导出权限类所在的包
如果使用了模块,那么必须导出,这样安全模块才可以访问到该权限类。
module-info.java 文件
(3)更新策略文件
(4)使用之前检查是否有权限
__EOF__

本文链接:https://www.cnblogs.com/zolmk/p/16537924.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!