我想100%保护我的应用程序并且不希望黑客进入内部。
这些是我从Stack Overflow中找到的解决方案。
在应用中集成 Proguard 。
将最重要的代码部分保存在C / C ++中。
使用NDK将代码原生地写入.So文件。
使用MD5加密api密钥。
还有其他方法可以完全保护我的Android应用免受黑客攻击,或者是上述提及的最佳解决方案。
这些是我找到的参考资料
How to avoid reverse engineering of an APK file?
How to prevent reverse engineering of an Android APK file to secure code?
答案 0 :(得分:9)
根本无法完全阻止您的应用进行逆向工程。如果有足够的资源,程序最终会进行逆向工程。这一切都取决于你的对手的动机。
在应用程序中集成Proguard
针对逆向工程的最有效的反措施是混淆。这就是Proguard所做的事情(但是,not too well来自我的收集)。 Proguard的网站称它是一个优化器,只能再次提供最小的保护。混淆只会使逆向工程的过程更难。它不会阻止逆向工程。
在C / C ++中保留代码中最重要的部分。
这是一种普遍的误解,即在本机代码中编写代码会阻止逆向工程。用C / C ++编写代码将编译和构建代码到机器语言,而更难进行逆向工程而不是Java字节码。但是,它仍然没有完全阻止它。
另外,用C / C ++编写代码,除非你是一个核心系统程序员,否则你有更多的机会引入很多错误
除此之外,您最终可能会在应用中引入大量漏洞,从信息泄露到缓冲区溢出。
允许您自己管理内存的语言(如C / C ++)非常强大。因此,它也可以让你更容易在脚下射击。这就是为什么Java被认为通常更安全的另一个原因(因为内存是由JVM在GC的帮助下管理的)。
因此,除非绝对需要在C / C ++中编写代码(比如说,您正在编写编解码器),否则请不要用C语言编写(只是为了减轻逆向工程)。
使用MD5加密api密钥
MD5是一种散列算法,它将数据散列为16字节的字符串。它也被认为是破碎的。您只能使用MD5进行哈希处理,而不能使用它进行加密。
即使您使用AES等算法加密密钥,您也需要将密钥存储在某处以便将来解密。攻击者可以从程序内存(运行时)或持久存储中轻松提取密钥,然后使用它来解密API密钥。
您希望阻止逆向工程的代码的任何敏感部分将其移动到远程服务器。说,你已经提出了一个很酷的算法,你不希望任何人进行逆向工程。
我建议,在服务器中构建REST API,接受来自客户端的数据,运行算法并返回结果。每当您需要使用此算法时,您可以通过应用程序对服务器进行REST调用,然后只使用您在应用程序中获得的结果。
所有敏感和机密数据(如API密钥)也可以存储在服务器中,不会直接在应用中公开。
这样可以确保代码的敏感部分不会泄露给您的对手。
答案 1 :(得分:1)
我将向您展示如何防止android应用程序被盗。我们问题的大背景是应用程序的数据而不是代码,所以为什么没有内置的框架可用于混淆字符串,这取决于开发人员的指纹。
我知道Proguard可以在混淆的函数和类名称上工作的框架。您知道每次我破解应用程序时,我都不需要知道函数或类名:)
但是我需要知道基本数据URL或屏幕上向用户显示的所有所有字符串。
因此保护APK的有效方法是使用开发人员的指纹来混淆字符串,因此当我要反编译应用程序时,如果没有原始指纹,我将无法获得服务URL或屏幕上显示的任何重要字符串。 / p>
有一个可以做到的框架叫做StringCare https://github.com/MostafaAnter/AndroidLibrary。