我正在为Android开发一款支付处理应用程序,我想防止黑客访问APK文件中的任何资源、资产或源代码。

如果有人将.apk扩展名更改为.zip,那么他们可以将其解压缩并轻松访问应用程序的所有资源和资产,并且可以使用dex2jar和Java反编译器访问源代码。对Android APK文件进行反向工程非常容易-有关更多详细信息,请参阅堆栈溢出问题从APK文件到项目的反向工程。

我已经使用了Android SDK提供的Proguard工具。当我对使用签名密钥库和Proguard生成的APK文件进行反向工程时,我得到了混淆的代码。

然而,Android组件的名称保持不变,一些代码(如应用程序中使用的关键值)保持不变。根据Proguard文档,该工具无法混淆Manifest文件中提到的组件。

现在我的问题是:

如何完全防止Android APK的反向工程?这可能吗?我如何保护应用程序的所有资源、资产和源代码,使黑客无法以任何方式破解APK文件?有没有办法让黑客攻击变得更加困难甚至不可能?我还能做什么来保护APK文件中的源代码?


当前回答

当您将其放在最终用户手中时,没有什么是安全的,但一些常见的做法可能会使攻击者更难窃取数据。

将主要逻辑(算法)放在服务器端。与服务器和客户端通信;确保服务器和客户端之间的通信通过SSL或HTTPS进行安全;或者使用其他技术用于密钥对生成算法(ECC和RSA)。确保敏感信息保持端到端加密。使用会话并在特定时间间隔后使其过期。加密资源并按需从服务器获取资源。或者你可以制作一个混合应用程序,通过webview访问系统,保护服务器上的资源+代码

多种方法;很明显,您必须牺牲性能和安全性。

其他回答

工具:在应用程序中使用ProGuard,可以限制其对应用程序进行反向工程

当您将其放在最终用户手中时,没有什么是安全的,但一些常见的做法可能会使攻击者更难窃取数据。

将主要逻辑(算法)放在服务器端。与服务器和客户端通信;确保服务器和客户端之间的通信通过SSL或HTTPS进行安全;或者使用其他技术用于密钥对生成算法(ECC和RSA)。确保敏感信息保持端到端加密。使用会话并在特定时间间隔后使其过期。加密资源并按需从服务器获取资源。或者你可以制作一个混合应用程序,通过webview访问系统,保护服务器上的资源+代码

多种方法;很明显,您必须牺牲性能和安全性。

在计算历史上,当您将软件的工作副本提供给攻击者时,从未有过阻止软件逆向工程的可能。而且,在大多数情况下,这是不可能的。

明白了这一点,就有了一个显而易见的解决方案:不要把你的秘密泄露给攻击者。虽然你不能保护APK的内容,但你可以保护的是你没有分发的任何内容。通常,这是服务器端软件,用于激活、支付、规则执行和其他有趣的代码。您可以通过不在APK中分发有价值的资产来保护它们。相反,设置一个服务器来响应应用程序的请求,“使用”资产(无论这意味着什么),然后将结果发送回应用程序。如果这个模型不适用于你心目中的资产,那么你可能需要重新思考你的战略。

此外,如果你的首要目标是防止应用程序盗版,那就别费心了。你已经在这个问题上花费了比任何反盗版措施都能挽救你的时间和金钱。解决这一问题的投资回报率很低,甚至连思考都没有意义。

这里的主要问题是,dex文件是否可以反编译,答案是它们可以“有点”。有像dedexer和smali这样的拆装器。

正确配置的ProGuard会使代码变得模糊。DexGuard是ProGuard的商业扩展版本,它可能会有更多帮助。然而,您的代码仍然可以转换为smali,具有逆向工程经验的开发人员将能够从smali中了解您正在做什么。

也许选择一个好的许可证,并以最好的方式通过法律强制执行。

如果你的应用程序如此敏感,那么你应该考虑服务器端的支付处理部分。尝试更改付款处理算法。使用Android应用程序仅用于收集和显示用户信息(即账户余额),而不是在Java代码中处理付款,请使用带有加密参数的安全SSL协议将此任务发送到您的服务器。创建一个完全加密和安全的API来与服务器通信。

当然,它也可能被黑客入侵,它与源代码保护无关,但考虑到它是另一个安全层,使黑客更难欺骗你的应用程序。