How to make apk Secure. Protecting from Decompile
你好
我正在为公司开发一个应用程序,我们的应用程序包含一个sqlite数据库,其中包含个人信息,我们希望对其进行保护。
我们如何保护它。 因为apk很容易完全反编译,因为我自己做了。
所以现在的问题是如何保护apk? 以及在手机上安装应用程序后如何保护手机中的数据库。
基本上,有5种方法可以保护您的APK不会被破解/反转/重新打包:
1.隔离Java程序
最简单的方法是使用户无法访问Java Class程序。这是最基本的方法,并且有多种特定的方法可以实现此目的。例如,开发人员可以将关键的Java类放置在服务器上,客户端通过访问服务器的相关接口而不是直接访问Class文件来获取服务。因此,黑客无法反编译Class文件。当前,通过接口提供的标准和协议服务越来越多,例如HTTP,Web Service,RPC等。但是有许多应用程序不适合此保护。例如,独立程序中的Java程序无法隔离。
2.加密类文件
为了防止直接反编译Class文件,许多开发人员会加密一些关键的Class文件,例如注册号,序列号管理和其他相关类。在使用这些加密的类之前,程序需要首先解密这些类,然后将这些类加载到JVM中。这些类可以通过硬件或软件解密。
开发人员通常通过自定义的ClassLoader类加载加密类(出于安全性,Applet不支持自定义的ClassLoader)。自定义的ClassLoader将首先找到加密类,然后将其解密。最后将解密的类加载到JVM。自定义的ClassLoader是此保护方法中非常重要的类。由于它本身未加密,因此可能是黑客的第一个目标。如果克服了相关的解密密钥和算法,则可以轻松地解密加密的类。
3.转换为本机代码
将程序转换为本地代码也是防止反编译的有效方法。因为本机代码通常很难反编译。开发人员可以将整个应用程序转换为本地代码,也可以仅转换关键模块。如果仅转换模块的关键部分,则Java程序使用这些模块时将需要JNI技术来调用。使用此方法保护Java程序时,它放弃了Java的跨平台功能。对于不同的平台,我们需要维护不同版本的本机代码,这将增加软件支持和维护工作量。但是对于某些关键模块,有时通常需要这种解决方案。为了保证这些本地代码不会被修改或替换,开发人员经常需要对这些代码进行数字签名。在使用这些本地代码之前,开发人员通常需要对这些本地代码进行身份验证,以确保黑客不会更改这些代码。如果签名检查通过,则开发人员可以调用相关的JNI方法。
4.代码混淆
代码混淆是为了重新组织和处理Class文件,使处理后的代码完成与未处理代码相同的功能(语义)。但是,混淆后的代码难以反编译,即,反编译后的代码很难理解,因此反编译人员很难理解真正的语义。从理论上讲,如果黑客有足够的时间,混淆的代码可能仍会被破解。甚至有些人也在开发去混淆工具。但是从实际情况来看,由于混淆技术的多元化发展,混淆理论的成熟,混淆的Java代码可以很好地防止反编译。
5.在线加密
APK Protect是APK的在线加密网站,但自2013年左右以来,活动显然已经停止。它提供了Java代码和C ++代码保护,以实现反调试和反编译效果。
我最初建议您使用后一种方法,因为它可以节省更多时间。根据我的经验,它非常简单,并且不需要很长时间。
现在有了豆形软糖已经成为可能。
1 2 3 4 5 6 7 | $ openssl enc -aes-128-cbc -K 000102030405060708090A0B0C0D0E0F -iv 000102030405060708090A0B0C0D0E0F -in my-app.apk -out my-app-enc.apk $ adb install --algo 'AES/CBC/PKCS5Padding' --key 000102030405060708090A0B0C0D0E0F --iv 000102030405060708090A0B0C0D0E0F my-app-enc.apk pkg: /data/local/tmp/my-app-enc.apk Success |
请阅读以下博客文章以获取更多详细信息
如果这是绝不能让用户掌握的机密信息,则无法保护它。从根本上讲,不可能在设备(代码或数据)上放置信息并让您的应用程序访问它,但不允许拥有设备的人访问该信息。
从安全的角度来看,对信息进行加密是没有意义的,因为您的应用程序必须包含解密所需的任何信息才能使用它,并且有足够动机的攻击者总是可以提取该信息并自行解密。
您所能做的就是使获取该信息的过程更加烦人和耗时,这仅在没有太多需要保密的情况下才有用。这就是使用proguard混淆您的.apk文件可以执行的操作。
您是否考虑过sqlite加密?查看此线程-适用于Android的sqlite加密
至于保护.apk,请尝试使用Proguard混淆代码。请参阅http://developer.android.com/guide/developing/tools/proguard.html
您可以尝试" Anti Decompiler(Android)Trial"
https://play.google.com/store/apps/details?id=com.tth.AntilDecompilerTrial
它使Proguard无法做到:
- 隐藏所有const值(字符串,字符),您将永远不会在apk文件中看到诸如" my key"," my val" ...之类的明文。
- 模糊文件名,在AndroidManifest.xml中引用
- 将伪代码添加到您的源代码中。事件强大的反编译器喜欢:dex2jar,jd-gui,...无法完全反转您的apk文件。大多数功能将带有注释"错误"显示。
=====
- 转换之后,如果您将某人的源项目交给他人,几乎将无法阅读和理解。
- 此解决方案不排除Proguard,您可以将它们组合在一起。 (功能,Proguard的现场混淆优于此解决方案的混淆功能)
您可以在以下位置阅读我的文章:http://www.androidpit.com/en/android/forum/thread/567093/An-Analysis-of-Android-APK-Protect-Shell-APKProtect。加上APK Protect的保护外壳的APK似乎无法反编译。我的意思是,加密方法非常先进。即使是高级黑客也需要很长时间才能破解它。
如果它是包含敏感数据的数据库,则可以像其他答案中提到的那样对几列的值或完整数据库的值进行加密,并确保密码未存储在设备上,但用户在访问密码时必须输入数据。
如果有一些代码需要保护,实际上没有很好的保护方法。在有限的用例范围内,您所能做的就是创建对在线服务的依赖关系并保护服务器。但是对于许多应用程序来说,这不是一个选择。