0

我需要与 Java Enterprise 应用程序中的 C/C++ 交互。我想编写一个能够收集节点/单元信息的类,可能还有关于应用程序部署位置的任何其他信息,所以我可以从 C++ 追溯到调用来自的文件系统中的 JAR(权威)。是否有我可以利用的特定 Java 库来提供有关应用程序的此类信息?理想情况下,会发生什么:(我们称之为 EnvProvider)

  1. Java App 调用 EnvProvider
  2. EnvProvider 收集有关调用它的 Java 应用程序的信息
  3. EnvProvider 调用包装好的 C++(CORBA、SOAP 可能?)并传递此信息
  4. C++ 跟踪将文件系统备份到调用应用程序,以检查声称的应用程序调用来自的实际 JAR 文件。

这听起来微不足道(此处仅列出 4 个步骤),但从我迄今为止的研究来看,似乎没有什么好的方法可以从 Java 应用程序本身获取有关 Java 应用程序的足够信息。通过“足够”的信息,我所说的足够给 C++ 足够的信息来遍历文件系统并找到已部署的 EAR、JAR、WAR。

您可以提供的任何信息将不胜感激!

问候

乍得

* 编辑*

金,谢谢你的回复。让我解释一下为什么我需要获取这个特定的跟踪。

我正在开发/使用一个用 C/C++ 编写的加密库。它们是我的前任在这里(我工作的地方)编写的,并且经过了很好的测试。然而,它们提供的不仅仅是加密,其中包含的算法是专有的,需要保持安全。这排除了在 Java 中实现相同的功能,因为 Java 太容易被反向编译。事实上,我的前任不遗余力地(有理由地)混淆 C/C++ 源代码。这些库与 Shell、本机 C/C++ 二进制可执行文件(.exe 等)以及调用将来自(大部分)完全包含的应用程序的其他应用程序很好地配合使用。此源提供了确保调用它的应用程序实际上是受信任的应用程序的方法(听起来类似于代码签名,

我正在尝试将此功能扩展到我们的 Enterprise Java 架构中,为了做到这一点,我需要能够返回调用的来源,即使这意味着只需要访问已部署的 WAR 甚至是应用程序已打包,因此我可以将源文件与 C/C++ 源代码一起使用。因此,如果调用来自应用程序 A,并且应用程序部署在 App_A.EAR 中,我想获取该信息并调用 C/C++,回溯到该 EAR 并使用它。如果这听起来令人困惑,我深表歉意,但我(作为行为问题)遗漏了大部分文件(.exe 或 JAR/WAR/EAR)的用途。

再次感谢您提供的任何帮助!

* 编辑*

乍得

4

1 回答 1

1

在我得到答案之前,您可能需要考虑三个问题:

  1. 为什么需要找到底层的jar/ear/war/class文件?您是否担心运行恶意代码?如果是这样,那么我强烈建议改用代码签名安全 策略。这些是平台内置的适当工具。
  2. 应用程序服务器和企业应用程序可能会使用自定义类加载器,这些加载器可以以其他应用程序无法立即访问的方式存储 jar 或类文件。我不记得有任何这样的例子,但请记住,Java 不会强加或强制任何一种方式来说明类加载器如何将资源映射到物理文件,只要它们始终如一地这样做。通过设计,加载类和资源的接口有意与底层操作系统的特性分离。尤其是企业应用程序的实现,如果它有助于加速和管理类加载器管理的资源,那么它可能会扰乱 jar 文件的存储方式。
  3. 对于集群环境,您可能不走运。Java Enterprise Edition 规范没有规定或管理集群中不同节点之间通信的所有部分。特定的供应商可能有专有接口,允许您确定远程接口正在与哪个节点通信,但由于集群和负载平衡的目标是使其对应用程序及其客户端透明,您可能更不可能访问此信息。

好的,继续回答。您可能想尝试调查Class.getProtectionDomainand ProtectionDomain.getCodeSource

ProtectionDomain protectionDomain = someObject.getClass().getProtectionDomain();
SourceLocation sourceLocation = protectionDomain.getCodeSource();
URL url = sourceLocation.getLocation();

请注意,调用getProtectionDomain可能会导致SecurityException取决于有效的安全策略。

更新:

听起来您的软件正在努力解决安全和信任问题。但是您不必每次运行代码时都检查二进制代码。您可以通过代码签名获得相同级别的信任。如何?签署代码。

  1. 当外部应用程序需要与您的库交互时,请索取二进制代码的副本以供检查。
  2. 当您对结果感到满意时,请使用您自己的私钥对代码进行签名。
  3. 接下来,设置一个仅允许您签名的应用程序运行的安全策略。

使用例如 RSA 和 2048 位密钥,甚至更大的密钥大小,实际上不可能用当今已知的针对 RSA 的攻击来替换签名代码的任何部分。

此策略要求您控制应用程序服务器和运行它的 JVM。如果您的信任问题超出此范围,您可能需要开始考虑强制使用开源应用程序服务器,您可以在其中检查源代码并签署二进制文件,并最终检查 JVM 本身。

在不了解您的架构和设置的具体细节的情况下,我仍然建议利用 Java 平台中内置的安全功能。

于 2011-02-27T00:40:49.347 回答