I am developing an application that has SQLite database to store personal information that must be protected. What are some ways of protecting these personal data? An APK can easily be de-compiled completely, so how can we secure an APK? Additionally, how can a database of a mobile application be protected?
-
i want the same to secure my code base? – Rajiv yadav Jun 18 '12 at 10:43
-
Check out my answer on a similar question: [hiding strings in Obfuscated code](http://stackoverflow.com/questions/4427238/hiding-strings-in-obfuscated-code/39856033#39856033) – Efra Espada Nov 17 '16 at 16:51
8 Answers
Basically, there are 5 methods to protect your APK being cracking/ reversing/ repackaging:
1. Isolate Java Program
The easiest way is to make users unable to access to the Java Class program. This is the most fundamental way, and it has a variety of specific ways to achieve this. For example, developers can place the key Java Class on the server, clients acquire services by access relevant interfaces of the server rather than access to the Class file directly. So there is no way for hackers to decompile Class files. Currently, there are more and more standards and protocols services provided through interfaces, such as HTTP, Web Service, RPC, etc. But there are lots of applications are not suitable for this protection. For example, Java programs in stand-alone programs are unable to isolate.
2. Encrypt Class Files
To prevent Class files from being decompiled directly, many developers will encrypt some key Class files, such as registration number, serial number management and other related classes. Before using these encrypted classes, the program needs to decrypt these classes first, then loading these classes into JVM. These classes can be decrypted by hardware, or software.
Developers often loading cryptographic classes through a customed ClassLoader class (Applet does not support customed ClassLoader because of security). Customed ClassLoader will find cryptographic classes first, then decrypt them. And finally loading the decrypted classes to JVM. Customed ClassLoader is a very important class in this protect method. Because it itself is not encrypted, it may be the first target of a hacker. If the relevant decryption key and algorithm have been overcome, then the encrypted classes can easily be decrypted.
3. Convert to Native Codes
Convert program to native codes is also an effective way to prevent decompilation. Because native codes are often difficult to be decompiled. Developers can convert the entire application to native codes, or they can also convert only key modules. If just convert key part of the modules, it will need JNI technology to call when Java programs are using these modules. It abandoned Java's cross-platform feature when using this mothod to protect Java programs. For different platforms, we need to maintain different versions of the native codes, which will increase software support and maintenance workload. But for some key modules, sometimes this solution is often necessary. In order to guarantee these native codes will not be modified or replaced, developers often need to digitally sign these codes. Before using these native codes, developers often need to authenticate these local codes to ensure that these codes have not changed by hackers. If the signature check is passed, then developers can call relevant JNI methods.
4. Code Obfuscation
Code obfuscation is to re-organize and process Class file, making the treated codes accomplish the same function (semantics) with the untreated codes. But the obfuscated codes are difficult to be decompiled, i.e., the decompiled codes are very difficult to understand, therefore decompile staffs are hard to understand the really semantics. Theoretically, if hackers have enough time, obfuscated codes may still be cracked. Even some people are developing de-obfuscate tool. But from the actual situation, since the diversified development of obfuscation, the mature of obfuscation theory, obfuscated Java codes can well prevent decompilation.
5. Online Encryption
APK Protect was an online encryption website for APK, but activity has apparently been discontinued since 2013 or so. It provided Java codes and C++ codes protection to achieve anti-debugging and decompile effects.
I originally suggested you use this last method for it could save you more time. Based on my experience, it was very simple to operate and it wouldn't take long time.

- 19,451
- 13
- 99
- 197

- 361
- 3
- 3
-
2APKProtect relies on bugs in the Android smali decompiler: it changes in the application so that the decompiler crashes and do not generate the source code. Thus, APKProtect will work until the decompiler targeted bug is corrected. See the comparison here: http://www.youtube.com/watch?v=t7M4AK1vZPA – Julien Kronegg Oct 11 '13 at 07:49
-
1After encrypting apk with APK Protect tool, I am no longer able to install this encrypted apk in my device or emulator. It's giving me INVALID_CERTIFICATE like error. How to solve this? – YuDroid Feb 12 '14 at 07:45
-
YouDroid, I had the same problem using ApkProtect Pc. But check your android version. The ApkProtect currently just work on 2.1-4.2 android version. See:http://www.apkprotect.com/ – Natan Lotério Apr 04 '14 at 14:48
-
@YuDroid you have to resign and realign your apk again manually: http://developer.android.com/tools/publishing/app-signing.html#signing-manually – Amio.io Sep 10 '14 at 06:49
-
The link you given for APK Protect is not working.!! any other suggestion? – MKJParekh Jun 16 '15 at 14:57
With Jellybean this has now become a possibility.
$ 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
Please read the following blog post for further details

- 8,204
- 6
- 48
- 78
-
1I installed openssl-0.9.8 in my Windows machine and tried the above command with my apk. But its always saying `error in enc`. What can be the issue? – YuDroid Feb 12 '14 at 10:28
If this is secret information that must not fall into the hands of your users, you cannot secure it. It is fundamentally impossible to put information on a device (code or data), and have your application access it, but not allow someone with the device to have access to that information.
Encrypting the information is pointless from a security point of view, because your application has to contain whatever is needed to decrypt it in order to use it, and a sufficiently motivated attacker can always extract that and decrypt it on their own.
All you can do is make it more annoying and time consuming to get access to that information, which only helps if there's not really that much of a need to keep it secret. This is what using proguard to obfuscate your .apk file can do.

- 68,572
- 20
- 126
- 174
-
1Sorry to Say but interestingly it make the code more easy to understand (proguard) :) i test it – Hamdullah shah Jun 04 '11 at 07:57
-
4I've rarely used proguard, and then only to strip out unnecessary parts of the Scala or Mercury standard library so programs written in Scala or Mercury were able to be translated for Android. But I believe it does have "obfuscate" options, that can mangle class/variable names and strip out other information potentially useful for reverse engineering. I would suspect you don't have them turned on if you found proguard output easier to read than the input source code. – Ben Jun 09 '11 at 05:08
You can try 'Anti Decompiler(Android)Trial'
https://play.google.com/store/apps/details?id=com.tth.AntilDecompilerTrial
It makes something Proguard doesn't:
- Hide all const values (string, character), you will never see clear text like "my key", "my val"... in your apk file
- Obfuscate file name, which is referenced in AndroidManifest.xml
- Add fake code to your source code. Event the powerful decompilers likes: dex2jar, jd-gui,... can't reverse exactly your apk file. Most of functions will show with comment 'Error'.
=====
- After transforming, if you give someone your source project, it will be nearly impossible to read and understand.
- This solution doesn't exclude Proguard, You can combine them together. (function, field Obfuscation of Proguard is better than Obfuscation features of this solution)

- 49
- 1
Have you considered sqlite encryption? See this thread - sqlite encryption for android
As for protecting your .apk, try obfuscating your code using proguard. See http://developer.android.com/guide/developing/tools/proguard.html
-
5Sorry to Say but interestingly it make the code more easy to understand (proguard) :) i test it – Hamdullah shah Jun 04 '11 at 07:56
-
Same results.it seams proguard is for newbies ... for learning decoded code. – Last Warrior Jul 30 '12 at 07:59
If it is the database that contains sensitive data you can encrypt the values of several columns or the full database like mentioned in the other answer and make sure that the password is not stored on the device but has to be entered by the user on accessing the data.
If there are pieces of code you need to protect there's really no good way of securing it. All you can for a limited amount of use-cases is to create a dependency to an online service and secure the server. But for a lot of applications this would not be an option.

- 1,089
- 9
- 16
You may read my post at: http://www.androidpit.com/en/android/forum/thread/567093/An-Analysis-of-Android-APK-Protect-Shell-APKProtect. The APK added with protect shell of APK Protect is seems unable decompile. I mean, the encrypt method is very advanced. Even a master hacker need long time to crack it.

- 29
- 1
-
2APKProtect relies on bugs in the Android smali decompiler: it changes in the application so that the decompiler crashes and do not generate the source code. Thus, APKProtect will work until the decompiler targeted bug is corrected. See the comparison here: youtube.com/watch?v=t7M4AK1vZPA – Julien Kronegg Oct 25 '13 at 08:28
First, make apk that can never be modified and used. I do it by temper detection from the server. I use root check emulator check. Then on the important activity, it checks root and emulator on every oncreate and on resume, deletes important data on onpause, Great. Now encrypt data and place license to server, use SSL server. It app can not be modified and run, everything is safe for ever. Well, how to avoid decompiler and online tamper detection. I do placing a huge code to generate some sample string from apk file, and compare it with an apk copy placed on the server. I have converted apk file to string. Just enjoy.

- 29
- 5