java - 是否可以完全用 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 / 包装器,即我正在寻找的东西是不可能的。这个问题是为了确保没有我不知道的可能性。
这个问题是对此的跟进:
我考虑过把它放在安全 SE 上:
https://security.stackexchange.com/
但是我认为唯一的问题(上面的粗体字)与所描述的原因无关,即我不是在寻找一种明智的方法来防止读取凭据或反编译函数,但我很想知道是否可以封装整个 Java 功能在一个 DLL 中。
解决方案
推荐阅读
- c# - 匿名结构声明
- php - 如何将 wordpress 分页网址从 sitename.com/pagename/2/ 更改为 sitename.com/pagename/?page=2?
- javascript - Javascript - 计算数组中的出现次数但不更改顺序
- javascript - 使选择标签专注于页面加载
- swift - 在尝试获取身份验证令牌时遇到“不支持的grant_type”问题
- android - 无法开始调试 vs 2017
- ibm-cloud - 有关区域的 IBM 工具链和持续交付计划问题
- android - 从相机拍摄屏幕截图不会显示全屏 android
- django - 用于两个单独查询/模型的 Django DetailView
- node.js - 如何从 winston@3 记录器输出中删除 [符号] 字段?