Android- 在 .so 文件中隐藏私钥

逆向工程 反编译 C 安卓 apk 软件安全
2021-06-20 06:17:48

我正在开发一个应用程序,我们需要在 Gradle 编译时加密某些资产。然后我们需要用相同的私钥解密它们,所以我们使用对称密钥系统,但我们可以使用非对称系统。关键问题是我们希望以某种方式将密钥保存在 APK 中,但安全地存储它们。这样我们就不必向服务器请求这些私钥或非对称系统中的合作伙伴密钥。APK 文件本身很容易逆向工程和反编译,包括资源和 Java 代码。

然而,我们在我们的应用程序中使用了一个 C 库。我们正在使用为 ARM 架构编译的这个库的 .so 文件。我们使用应用程序主 Java 代码中的 SWIG 接口与该库进行交互。我想知道是否可以将私钥存储在该库的源代码中,然后通过 SWIG 绑定函数访问这些密钥。我认为这是解决我的问题的最佳解决方案,因为 ARM .so 文件需要花哨的商业反编译器和 ARM 体系结构的知识才能有效地对它们进行逆向工程。从而使这种获取私钥的方法非常安全。

3个回答

如果您的应用程序可以解密文件,那么您应该假设任何足够感兴趣的人也可以这样做。故事结局。

混淆可以减慢人们的速度,但它不会阻止所有人,而且它可能不会像您想象的那样有效。

将密钥隐藏在 apk 中的任何位置(包括 .so 文件)绝对不足以长时间保密密钥。绝对可以执行的代码可以逆向工程,并且可以提取密钥 - 即使没有花哨的反编译器和了解ARM架构(顺便说一句,arm32有一个非商业反编译器)。

我强烈建议您阅读有关白盒密码学的一些内容,并在该特定领域寻找解决方案,该解决方案是为了解决此类问题而开发的。

然而,我们在我们的应用程序中使用了一个 C 库。我们正在使用为 ARM 架构编译的这个库的 .so 文件。我们使用应用程序主 Java 代码中的 SWIG 接口与该库进行交互。我想知道是否可以将私钥存储在该库的源代码中,然后通过 SWIG 绑定函数访问这些密钥。

我完全确定您可以,但是什么阻止某人使用该 C 库并通过它objdump或 Radare 并找出您的密钥存储位置?使用类似的东西binwalker可能比使用 Java 需要更少的技能。如果将其存储为字符串,则/usr/bin/strings它本身可能会拾取它。

ARM .so 文件需要花哨的商业反编译器和 ARM 体系结构的知识

不是真的:objdump-marm),并radare支持ARM。如果您从未玩过这些,请试一试。