您好 我正在为公司开发一个应用程序,我们的应用程序包含一个包含个人信息的sqlite数据库,我们希望保护它。 我们怎样才能保护它。因为我很容易反编译,因为我自己做了。 所以现在的问题是如何保护apk?以及如何在手机上安装应用程序后保护手机中的数据库。
答案 0 :(得分:32)
基本上,有5种方法可以保护您的APK正在破解/撤消/重新打包:
最简单的方法是让用户无法访问Java Class程序。这是最基本的方式,它有多种具体的方法来实现这一目标。例如,开发人员可以将密钥Java类放在服务器上,客户端通过访问服务器的相关接口获取服务,而不是直接访问Class文件。因此,黑客无法反编译类文件。目前,通过接口提供的标准和协议服务越来越多,如HTTP,Web Service,RPC等。但是有很多应用程序不适合这种保护。例如,独立程序中的Java程序无法隔离。
为了防止类文件被直接反编译,许多开发人员将加密一些关键的Class文件,例如注册号,序列号管理和其他相关类。在使用这些加密类之前,程序需要首先解密这些类,然后将这些类加载到JVM中。这些类可以通过硬件或软件解密。
开发人员经常通过自定义的ClassLoader类加载加密类(由于安全性,Applet不支持自定义的ClassLoader)。 Customed ClassLoader将首先找到加密类,然后解密它们。最后将解密的类加载到JVM。 Customed ClassLoader是这种保护方法中非常重要的一个类。因为它本身没有加密,所以它可能是黑客的第一个目标。如果已经克服了相关的解密密钥和算法,则可以很容易地解密加密的类。
将程序转换为本机代码也是防止反编译的有效方法。因为本机代码通常很难被反编译。开发人员可以将整个应用程序转换为本机代码,也可以只转换关键模块。如果只是转换模块的关键部分,当Java程序使用这些模块时,它将需要JNI技术来调用。在使用此方法保护Java程序时,它放弃了Java的跨平台功能。对于不同的平台,我们需要维护不同版本的本机代码,这将增加软件支持和维护工作量。但对于某些关键模块,有时这种解决方案通常是必要的。为了保证这些本机代码不会被修改或替换,开发人员通常需要对这些代码进行数字签名。在使用这些本机代码之前,开发人员通常需要对这些本地代码进行身份验证,以确保黑客不会更改这些代码。如果签名检查通过,那么开发人员可以调用相关的JNI方法。
代码混淆是重新组织和处理类文件,使得处理过的代码与未处理的代码完成相同的功能(语义)。但是混淆的代码很难被反编译,即反编译的代码很难理解,因此反编译人员很难理解真正的语义。从理论上讲,如果黑客有足够的时间,混淆的代码可能仍然会被破解。甚至有些人正在开发去混淆工具。但从实际情况来看,由于混淆的多样化发展,混淆理论的成熟,混淆的Java代码可以很好地防止反编译。
APK Protect是APK的在线加密网站,但自2013年以来,活动显然已停止使用。它提供了Java代码和C ++代码保护,以实现反调试和反编译效果。
我最初建议您使用最后一种方法,因为它可以为您节省更多时间。根据我的经验,操作非常简单,不会花很长时间。
答案 1 :(得分:8)
使用Jellybean现在已成为可能。
$ 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
请阅读以下博文,了解更多details
答案 2 :(得分:5)
如果这是不能落入用户手中的秘密信息,则无法保护它。从根本上说,不可能将信息放在设备上(代码或数据),让应用程序访问它,但不允许有设备的人访问该信息。
从安全的角度来看,加密信息是没有意义的,因为你的应用程序必须包含解密它才能使用它所需要的东西,并且一个充满动力的攻击者总能提取它并自己解密它。 / p>
所有你能做的就是让访问这些信息变得更加烦人和耗时,这只有在没有那么多需要保密的情况下才有用。这就是使用proguard来混淆你的.apk文件所能做到的。
答案 3 :(得分:4)
你考虑过sqlite加密吗?请参阅此主题 - sqlite encryption for android
至于保护.apk,请尝试使用proguard对代码进行模糊处理。见http://developer.android.com/guide/developing/tools/proguard.html
答案 4 :(得分:3)
您可以在http://www.androidpit.com/en/android/forum/thread/567093/An-Analysis-of-Android-APK-Protect-Shell-APKProtect阅读我的帖子。添加了APK Protect的保护外壳的APK似乎无法反编译。我的意思是,加密方法非常先进。即使是黑客大师也需要很长时间才能破解它。
答案 5 :(得分:3)
您可以尝试'Anti Decompiler(Android)试用版
https://play.google.com/store/apps/details?id=com.tth.AntilDecompilerTrial
它让Proguard没有:
=====
答案 6 :(得分:1)
首先,制作永远无法修改和使用的apk。我通过服务器的温度检测来做到这一点。我使用根检查模拟器检查。然后在重要的活动上,它在每次创建和恢复时检查根和模拟器,在暂停时删除重要数据,太好了。现在加密数据并将许可证放置到服务器,使用 SSL 服务器。它的应用程序无法修改和运行,一切都是永远安全的。那么,如何避免反编译和在线篡改检测。我确实放置了一个巨大的代码来从 apk 文件生成一些示例字符串,并将其与放置在服务器上的 apk 副本进行比较。我已将 apk 文件转换为字符串。尽情享受吧。
答案 7 :(得分:0)
如果是包含敏感数据的数据库,您可以像其他答案中提到的那样加密多个列的值或完整数据库,并确保密码不存储在设备上但必须由用户输入访问数据。
如果有一些代码需要保护,那么确保它没有好办法。对于有限数量的用例,您可以创建对在线服务的依赖关系并保护服务器。但对于很多应用程序来说,这不是一个选择。