首页 > 解决方案 > 我可以使用 java.security 强制可见性吗?

问题描述

这是关于 Groovy(Java 的超集/现代化)的这个问题的后续内容,其中看似基本上没有信息隐藏,也没有任何封装。

但是在 Java 中当然也有反射,这意味着privateprotectedpackage-private 本质上是没有意义的,或者更糟的是:创造一种虚假的安全感。

在 Java 中,有没有办法强制执行某种可见性,不一定是在特定意义上强制执行上述可见性修饰符和包私有,使用SecurityManager? 我才刚刚开始研究后者,我看不到任何非常明显的方式来完成类似的事情。但似乎一些开发人员必须在某些类和方法不完全公开可见性的情况下发布代码......那么它是如何完成的呢?

PS 在我有点熟悉的 Lucene 包中,我注意到很多类都变成了final(这有时让我有些头疼......)但我很确定,虽然不是当然,该反射可用于压缩该修饰符

标签: javavisibilityencapsulationinformation-hidingjava-security-manager

解决方案


无论 SecurityManager 配置如何,我都可以将我的类编写为 setAccessible-proof 吗?... 还是我任由管理配置的人摆布?

你不能,你肯定是。任何有权访问您的代码的人都可以随意配置他们的 JVM 和 SecurityManager。(下面有更多详细信息)

setAcessible 合法吗?它为什么存在?

Java 核心类使用它作为访问出于安全原因必须保持私有的内容的简单方法。例如,Java 序列化框架在反序列化对象时使用它来调用私有对象构造函数。有人提到 System.setErr,这将是一个很好的例子,但奇怪的是 System 类方法 setOut/setErr/setIn 都使用本机代码来设置 final 字段的值。

另一个明显的合法用途是需要窥探对象内部的框架(持久性、Web 框架、注入)。

最后...

Java 访问修饰符并非旨在成为一种安全机制。

那么我实际上能做些什么呢?

您应该深入了解Java SE 安全文档的安全提供程序部分:

应用程序不需要自己实现安全性。相反,他们可以从 Java 平台请求安全服务。安全服务在提供者中实现

Java 平台中的访问控制架构保护对敏感资源(例如,本地文件)或敏感应用程序代码(例如,类中的方法)的访问。所有访问控制决策都由以java.lang.SecurityManager类为代表的安全管理器进行调解。必须将 SecurityManager 安装到 Java 运行时中才能激活访问控制检查。

Java 小程序和 Java™ Web Start 应用程序在安装了 SecurityManager 的情况下自动运行。但是,通过该命令执行的本地应用程序java默认情况下不会在安装了 SecurityManager 的情况下运行。为了使用 SecurityManager 运行本地应用程序,应用程序本身必须通过setSecurityManager方法(在java.lang.System类中)以编程方式设置一个,或者必须-Djava.security.manager在命令行上使用参数调用 java。

我建议您在官方安全文档中进一步阅读

https://docs.oracle.com/javase/7/docs/technotes/guides/security/overview/jsoverview.html


推荐阅读