首页 > 解决方案 > 是否可以完全用 C++ 包装 Java 函数?

问题描述

设想

假设正在开发一个 Java 应用程序。假设它包含需要隐藏的功能。反编译 Java 并不是一个真正的问题,除了只需使用归档管理器(例如 7zip)打开 JAR 即可获得大量信息。

有 ProGuard 等工具:

https://www.guardsquare.com/en/products/proguard/manual/examples#application

此类工具可用于混淆 Java 代码库,但是,这存在一些问题,例如,仍然可以通过一些(充其量)适度的努力来导出大量逻辑。此外,使用 ProGuard 无法有效处理某些代码库。

最终,在某些情况下,我需要使用一些 Java API 并向其传递一些凭据。但是这些凭证——无论存储多么安全——都可以在运行时读取,只需附加一个调试器,然后以纯文本形式查看它们,或者如果它们存储在 C++ 端,则可以通过访问 C++ 函数使用新的 JAR 提取它们, ETC。

问题

问题本身与我的问题并不相关,但它让我想知道 -有没有办法使用 C++ 包装整个 Java 功能,用 Java 编写函数,然后以某种方式将它们打包成 DLL?

我知道 JNI 的存在,在那里我可以使用函数访问通过 DLL 提供的 C++ 功能native(事实上,这已经在我的应用程序中大量使用)。但是,如果我打算将 Java 函数存储在 DLL 中,然后直接将它们提供给 JVM,而不必先将它们解压缩到 JAR 中呢?如果您正在考虑虚拟机 - 这就是这些方面的某个地方。

例子

假设我的 Java 代码库中有这样的内容:

import io.sentry.Sentry;
import io.sentry.SentryClient;

public class SentryController
{
    private version = "someversion";
    private superSecretSentryString = getSecretStringFromKMS(); // beautiful alliteration

    public SentryController()
    {
        Sentry.init( superSecretSentryString ); // stored safely in KMS, but easily read on runtime
        Sentry.getStoredClient().setRelease( version ); 

        // ...
    }

    // ...

}

假设我不希望任何人看到这个类并打算将它完全移动到一个 DLL 中,同时仍然能够使用import io.sentry.Sentry并因此能够访问 Sentry API。

免责声明

我知道很可能不存在这样的 API / 包装器,我正在寻找的东西是不可能的。这个问题是为了确保没有我不知道的可能性。

这个问题是对此的跟进:

Java / C++ 加密和 JNI 接口

我考虑过把它放在安全 SE 上:

https://security.stackexchange.com/

但是我认为唯一的问题(上面的粗体字)与所描述的原因无关,我不是在寻找一种明智的方法来防止读取凭据或反编译函数,但我很想知道是否可以封装整个 Java 功能在一个 DLL 中。

标签: javac++java-native-interfacewrapper

解决方案


推荐阅读