如何使apk安全。 防止反编译

您好,我正在开发一个公司的应用程序,我们的应用程序包含一个包含个人信息的sqlite数据库,我们希望保护它。 我们如何保护它。 因为一个apk很容易反编译,因为我自己做了。 所以现在的问题是如何保护apk? 以及如何在手机上安装应用程序后保护手机中的数据库。

基本上,有5种方法来保护你的APK正在破解/倒车/重新包装:

1.隔离Java程序

最简单的方法是让用户无法访问Java类的程序。 这是最基本的方法,它有多种具体的方法来实现这一点。 例如,开发人员可以将关键Java类放在服务器上,客户端通过访问服务器的相关接口来获取服务,而不是直接访问类文件。 所以黑客无法反编译Class文件。 目前,通过接口提供的标准和协议服务越来越多,如HTTP,Web Service,RPC等,但有很多应用不适合这种保护。 例如,独立程序中的Java程序无法隔离。

2.encryption类文件

为了防止Class文件被直接反编译,很多开发人员会encryption一些关键的Class文件,如注册号,序列号pipe理和其他相关的类。 在使用这些encryption类之前,程序需要首先解密这些类,然后将这些类加载到JVM中。 这些类可以通过硬件或软件解密。

开发人员经常通过定制的ClassLoader类加载encryption类(由于安全性,Applet不支持定制的ClassLoader)。 Customed ClassLoader将首先查找encryption类,然后解密它们。 最后将解密的类加载到JVM。 定制ClassLoader是这种保护方法中非常重要的一个类。 因为它本身没有encryption,所以可能是黑客的第一个目标。 如果相关的解密密钥和algorithm已经被克服,那么encryption的类可以被容易地解密。

3.转换为本地代码

将程序转换为本地代码也是防止反编译的有效方法。 由于本地代码通常难以反编译。 开发人员可以将整个应用程序转换为本地代码,也可以只转换关键模块。 如果只是转换模块的关键部分,当Java程序使用这些模块时,将需要JNI技术来调用。 当使用这个方法来保护Java程序时,它放弃了Java的跨平台function。 对于不同的平台,我们需要维护不同版本的本地代码,这会增加软件的支持和维护工作量。 但是对于一些关键模块,有时候这个解决scheme通常是必须的 为了保证这些本地代码不会被修改或replace,开发人员经常需要对这些代码进行数字签名。 在使用这些本地代码之前,开发人员通常需要对这些本地代码进行身份validation,以确保这些代码没有被黑客改变。 如果签名检查通过,开发人员可以调用相关的JNI方法。

4.代码混淆

代码混淆是为了重新组织和处理Class文件,使被处理的代码与未处理的代码完成相同的function(语义)。 但混淆代码难以反编译,即反编译代码难以理解,反编译人员难以理解真实的语义。 从理论上讲,如果黑客有足够的时间,混淆的代码仍然可能被破解。 甚至有些人正在开发去混淆工具。 但从实际情况看,由于混淆的多样化发展,混淆理论的成熟,混淆的Java代码可以很好的防止反编译。

5.在线encryption

APK Protect是APK的在线encryption网站,但自2013年以来,显然已经停止了活动。 它提供了Java代码和C ++代码保护来实现反debugging和反编译效果。

我最初build议你使用这最后的方法,它可以为您节省更多的时间。 根据我的经验,操作非常简单,不需要很长时间。

随着软糖,这现在已成为一种可能性。

$ 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 

请阅读以下博客文章了解更多详情

如果这些秘密信息不能落入用户手中,则无法保护。 将信息放在设备(代码或数据)上是根本不可能的,并让您的应用程序访问它,但不允许设备的某个人访问该信息。

从安全的angular度来看,encryption信息是毫无意义的,因为你的应用程序必须包含解密它所需的任何东西以便使用它,而充分动机的攻击者总是可以提取并自行解密。

你所能做的就是让它更加烦人和耗费时间去获取这些信息,这只有在没有太多需要保密的情况下才有用。 这是使用proguard混淆您的.apk文件可以做的。

你考虑过sqliteencryption吗? 看到这个线程 – android的sqliteencryption

至于保护您的.apk,请尝试使用proguard混淆您的代码。 请参阅http://developer.android.com/guide/developing/tools/proguard.html

您可以阅读我的post: http : //www.androidpit.com/en/android/forum/thread/567093/An-Analysis-of-Android-APK-Protect-Shell-APKProtect 。 APK Protect加保护的APK似乎无法反编译。 我的意思是,encryption方法非常先进。 即使是黑客大师也需要很长时间才能破解它。

你可以试试“反编译器(Android)试用版”

https://play.google.com/store/apps/details?id=com.tth.AntilDecompilerTrial

这使得Proguard不会:

  • 隐藏所有的常量值(string,字符),你永远不会看到明确的文字,如“我的钥匙”,“我的val”…在你的apk文件
  • 在AndroidManifest.xml中引用混淆文件名
  • 添加假代码到您的源代码。 事件强大的反编译器喜欢:dex2jar,jd-gui,…不能扭转你的apk文件。 大多数function将显示评论“错误”。

=====

  • 改造之后,如果你给别人你的源项目,那么阅读和理解几乎是不可能的。
  • 这个解决scheme不排除Proguard,你可以把它们组合在一起。 (function方面,Proguard的Obfuscation比该解决scheme的混淆function要好)

如果是包含敏感数据的数据库,则可以像在另一个答案中提到的那样对多个列或整个数据库的值进行encryption,并确保密码不存储在设备上,但必须由用户在访问数据。

如果有一些代码需要保护,确实没有什么好的方法来保护它。 您只需要有限的用例就可以创build对在线服务的依赖关系并保护服务器。 但是对于很多应用程序来说,这不是一个选项。