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

但是,我们在应用程序中使用的是C库。我们使用的是针对ARM体系结构编译的该库的.so文件。我们使用应用程序主Java代码中的SWIG接口与该库进行交互。我想知道是否可以将私钥存储在该库的源代码中,然后通过SWIG绑定函数访问这些密钥。我认为这是针对我的问题的最佳解决方案,因为ARM .so文件需要出色的商业反编译器和ARM体系结构的知识才能有效地对其进行反向工程。因此,使获取私钥的方法变得相当安全。

评论

您想从Java访问密钥,对吗?在这种情况下,一种简单的解决方法是,在调用调用方法来检索它后,附加一个调试器并获取密钥。

硬编码密码密钥的做法有其自己的CWE条目:cwe.mitre.org/data/definitions/321.html

如何进行C代码中的所有解密和其他工作?

对于大多数经验丰富的逆向工程师而言,您的“漂亮的东西安全性”都是微不足道的。

#1 楼

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

我强烈建议您阅读有关白盒加密的知识,并在为解决此类问题而开发的特定领域中寻找解决方案。

#2 楼

如果您的应用程序可以解密文件,那么您应该假定有足够兴趣的人也可以解密。故事的结局。

迷惑会使人放慢脚步,但不会阻止所有人,而且可能不会像您认为的那样有效。

#3 楼


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


我完全可以,但是会阻止某人从获取该C库并将其通过objdump或Radare传递,并弄清楚密钥的存储位置?与binwalker之类的东西相比,使用Java可能需要的技巧更少。如果将其存储为字符串,则/usr/bin/strings本身可能会选择它。


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


并非如此:objdump-marm)和radare支持ARM。如果您从未玩过这些游戏,请试一试。


objdump
radare2