5

我有一Java堂课,里面有一些我不想提供给任何未经授权的班级的机密信息。

我想在一些包中访问这个类(这个包中的类将使用机密信息),所以我的安全类应该可以在这些包中访问。

有什么方法可以检查方法的调用者是否是来自授权包的授权类?

我知道 public/private/default 所有东西(所以请不要让我使用它),但这些在这里没有用,因为我希望在某些包中可以访问一个类(不是一个/相同的)。

4

6 回答 6

5

我觉得你走错了方向。这可能是一个设计问题。

安全要求是您的业务逻辑。您应该以某种方式实现您的安全策略,而不是依赖于 java 语言级别的可见性修饰符或调用程序包名称。因为如果您将罐子交给某人,他无论如何都可以访问您的“机密”课程。

而且,类是一种类型,一种抽象的东西。它不应包含“数据”。当然有时conf信息被写为静态变量等。但是,如果某些数据是敏感的,则不应将其写入类中。它可以存储在数据库或加密文件等中。一旦收到对敏感信息的请求,您就可以检查您实施的安全策略是否允许访问这些数据。

只是我的 2cents

于 2012-10-09T12:15:46.670 回答
2

Java 中的可见性修饰符不是安全工具,而是 OO 设计工具。无论你做什么,如果有人使用你的类,它可以使用反射访问任何类的任何私有成员。

如果您的对象包含机密信息,请将这些对象留在您的安全服务器中。

于 2012-10-09T11:56:28.813 回答
1

您可以创建一个Exception(不需要抛出它)并使用它getStackTrace()来分析调用堆栈。不过,我总觉得它很丑。

也就是说,您放入客户端机器的任何东西都容易受到该机器的攻击;如果您有一些真正机密的东西,请在您的服务器中保护它;使其仅作为服务提供。

于 2012-10-09T11:55:44.727 回答
0

您可能可以在此处利用 aspectj。理论上可以根据当前流范围拦截对给定类方法的调用,并让切面抛出异常或其他东西。虽然我不是aspectj专家,但是“cflow”切入点限定符将是您最有可能的选择。也许是这样的

!cflow(调用(* com.mycom.AllowedClient.*))

我还没有测试过这种切入点,但我相信它会起作用。

不过,在这种情况下,您可能希望编译时编织(而不是加载时编织)。

作为旁注,我同意其他一些我认为这是错误的方法。您保护数据。您根据登录的用户权限保护功能访问。您通常不会保护来自其他类的函数调用。

于 2012-10-09T14:14:56.717 回答
0

您可以使用由 Java 中的Proxy类实现的代理模式——它完全是为您的目的而设计的。

是一个操作方法。

编辑:AFAIK,您不能对静态方法使用常规代理机制,因为代理和代理类必须实现一个公共接口。但是,还有更高级的工具,它们可能会帮助您喜欢javassist。不幸的是,我自己并不熟悉。

于 2012-10-09T11:53:54.610 回答
0

指南 4-2 / EXTEND-2:限制包的可访问性 容器可以通过添加到 package.access 安全属性来隐藏实现代码。此属性可防止来自其他类加载器的不受信任的类在指定的包层次结构上链接和使用反射。在设置此属性之前,必须注意确保不受信任的上下文无法访问包。

此示例代码演示如何附加到 package.access 安全属性。请注意,它不是线程安全的。此代码通常应仅在系统中出现一次。

private static final String PACKAGE_ACCESS_KEY = "package.access";

static {
    String packageAccess = Security.getProperty(PACKAGE_ACCESS_KEY);
    Security.setProperty(PACKAGE_ACCESS_KEY,
                         (packageAccess == null || packageAccess.trim().isEmpty()
                                 ? "" : packageAccess + ",")
                                 + "xx.example.product.implementation.");
}
于 2020-11-03T18:27:00.963 回答