Secure App — Implementasi Android NDK

Yusuf Safrudin
TLabCircle
Published in
3 min readJun 30, 2021
Photo by Franck on Unsplash

Sebagai android developer kita sering menggunakan third party library dan API dalam membuat sebuah aplikasi. Terkadang ketika kita ingin menggunakan sebuah layanan API ada yang membutuhkan Api Key untuk mengakses API tersebut baik yang berbayar atau gratis. atau ketika anda men-develop aplikasi yang bersifat private, dimana mereka tidak ingin mengekspos Key yang mereka kirimkan ketika request ke server. Kebanyakan dari kita menaruh Key di string.xml,build.gradle file atau bahkan meng hardcode API Key tersebut. ini contoh deklarasi Api Key di file strings.xml:

<resources>
<string name="app_name">Native Kit</string>
<string name="api_ket">MY_API_KEY</string>
</resources>

atau deklarasi di gradle file:

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
buildConfigField 'String', "ApiKey", '"MY_API_KEY"'
}
}

Mendeklarasikan static string di string.xml maupun di gradle file itu kurang aman, karena ketika aplikasi kita di decompile mereka masih bisa menemukan Api Key tersebut.

Ada beberapa cara yang dapat kita lakukan untuk menambah layer security salah satunya dengan menggunakan native C/C++, meskipun tidak menjamin bahwa dengan menerapkan itu, key tidak dapat di ekstrak.

No system is safe

Let’s start

Sebelum ke implementasinya, ada beberapa tools yang perlu di download:

  1. Pilih Tools > SDK Manager.
  2. Pilih tab SDK Tools
  3. Pilih NDK (Side by side) dan CMake

NDK (Side by side): Native Development Kit digunakan untuk menulis code C/C++.

CMake: open source untuk me-manage build process(compiler).

setelah kita download tools yang dibutuhkan, selanjutnya buat file CMakeLists.text dan native-lib.cpp taruh di dalam directory cpp.

Kita masukkan API Key kita ke file native-lib.cpp seperti dibawah ini:

#include <jni.h>
#include <string>

extern "C" JNIEXPORT jstring JNICALL
Java_id_kotlin_nativekit_MainActivity_apiKey(JNIEnv *env, jobject) {
std::string key = "c2VjdXJlIGFwcCBrZXk=";
return env->NewStringUTF(key.c_str());
}

Format penulisannya PackageName_ActivityName_MethodName.

Pada CMakeLists.txt tambahkan code seperti dibawah ini:

Selanjutnya kita deklarasikan CMakeList ke build.gradle seperti ini:

android {
...
externalNativeBuild {
cmake {
path file('src/main/cpp/CMakeLists.txt')
version "3.10.2"
}
}
}

Karena kita sudah setup untuk native C/C++, sekarang kita akan akses API Key tersebut di Activity atau class yang kamu inginkan. Untuk me load file native kita gunakan method System.loadLibrary(“native-lib”).

companion object {
init {
System.loadLibrary("native-lib")
}
}

Setelah kita load library native, kita deklarasikan external function sesuai nama di native code:

private external fun apiKey(): String

Oke tinggal kita panggil saja function tersebut dan tampilkan di textView:

binding.tvApiKey.text = apiKey()

Booom!!! 💥💥 kita berhasil memanggil native code c/c++ ke project kita.

Kita berhasil menerapkan native code C/C++ ke dalam project android kita, dengan menggunakan native code kita sudah menambah layer untuk security pada aplikasi kita. Ketika nanti kita compile, aplikasi tersebut akan menghasilkan .so file. file tersebut berisi binary code sehingga akan susah untuk melakukan reverse engineering, meskipun begitu masih ada metode-metode untuk me-decompile .so file. tapi setidaknya kita sudah mempersulit ketika ada yang ingin me-reverse engineer aplikasi kita. Adapun solusi jika ingin menambahkan keamanan bisa kita implementasikan enkripsi pada aplikasi kita.

Selamat Mencoba 😎 💻

--

--