关于安全性:保护Android App免受逆向工程

Protect Android App from reverse engineering

我想100%保护我的应用程序并且不希望黑客进入内部。

这些是我从Stack Overflow中找到的解决方案。

  • 在应用程序中集成Proguard。

  • 在C / C ++中保留代码中最重要的部分。

  • 使用NDK将代码本机编写到.So文件中。

  • 使用MD5加密api密钥。

  • 那么有没有其他方法可以完全保护我的Android应用程序免受黑客攻击,或者这是上述提到的最佳解决方案。

    这些是我发现的参考文献

    如何避免APK文件的逆向工程?

    如何防止Android APK文件的逆向工程以保护代码?


    根本没有办法完全阻止您的应用程序的逆向工程。如果有足够的资源,程序最终会进行逆向工程。这一切都取决于你的对手的动机。

    Integrating Proguard in the app

    反向逆向工程最有效的反制是混淆。这就是Proguard的作用(但是,与我收集的不太一样)。 Proguard的网站称它是一个优化器,只能再次提供最小的保护。混淆只会使逆向工程的过程更加困难。它不会阻止逆向工程。

    Keeping most important part of the code in C/C++.

    这是一种普遍的误解,即在本机代码中编写代码将阻止逆向工程。用C / C ++编写将编译和构建代码到机器语言,这比Java字节码更难逆向工程。但是,它仍然没有完全阻止它。

    另外,用C / C ++编写代码,除非你是一个硬核系统程序员,你有更多的机会引入很多bug

    • 令人讨厌的分段错误
    • 内存泄漏
    • 免费使用

    除此之外,您最终可能会在应用程序中引入大量漏洞,从信息泄露到缓冲区溢出。

    允许您自己管理内存的语言(如C / C ++)非常强大。因此,它也可以让你更容易在脚下射击。这就是为什么Java被认为通常更安全的另一个原因(因为内存是由JVM在GC的帮助下管理的)。

    因此,除非绝对需要在C / C ++中编写代码(比如说,您正在编写编解码器),否则请不要用C语言编写(只是为了减轻逆向工程)。

    Encrypting the api keys using MD5

    MD5是一种散列算法,它将数据散列为16字节的字符串。它也被认为是破碎的。您只能使用MD5进行哈希处理,而不能使用它进行加密。

    即使您使用AES等算法加密密钥,您也需要将密钥存储在某处以便将来解密。攻击者可以从程序内存(运行时)或持久存储中轻松提取密钥,然后使用它来解密API密钥。

    建议

    您希望阻止逆向工程的代码的任何敏感部分将其移动到远程服务器。说,你已经提出了一个很酷的算法,你不希望任何人进行逆向工程。

    我建议,在服务器中构建一个REST API,它接受来自客户端的数据,运行算法并返回结果。每当您需要使用此算法时,您可以从应用程序对服务器进行REST调用,然后只使用您在应用程序中获得的结果。

    所有敏感和机密数据(如API密钥)也可以存储在服务器中,而不会直接在应用程序中公开。

    这将确保您的敏感部分代码不会泄露给您的对手。


    我将告诉你如何防止Android应用程序被盗。我们问题的大局是应用程序的数据不是代码,那么为什么没有内置框架可以处理混淆的字符串取决于开发人员的指纹。

    我知道Proguard是一个适用于混淆函数和类名的框架。你知道每次我破解应用程序我都不需要知道功能或类名:)

    但我需要知道基本数据URL或屏幕上向用户显示的所有字符串。

    所以保护APK的有效方法是使用开发人员的指纹来混淆字符串,所以当我要反编译应用程序时,我无法获得服务URL或屏幕上显示的没有原始指纹的任何重要字符串。

    有一个框架可以做到这一点叫做StringCare
    https://github.com/MostafaAnter/AndroidLibrary。