Yudi Karma
4 min readOct 25, 2019

Better way for secure Your Google Api Key in Android Application

Photo by Micah Williams on Unsplash

dalam mendevelop aplikasi android kita pasti akan membutuhkan dengan service lain seperti Google maps API, Google Place API dan untuk dapat menggunakan service nya kita harus mendapatkan API KEY nya terlebih dahulu.

Hal ini mungkin tidak terlalu menjadi masalah jika Service google ini masih gratis atau belum memerlukan enable billing Invoice untuk dapat menggunakna service nya. tapi saat ini google telah menerapkan Aturan untuk dapat menggunakan service nya maka developer atau company harus mengatur billing pembayaran nya. service nya masih tetap gratis jika bayaran dari request kita masih dibawah batas quota yang diterapkan google. untuk saat ini yaitu $200

karena hal tersebut maka kita harus lebih peduli terhadap keamanan API KEY karena jika sampai digunakan oleh orang lain maka yang harus membayar invoice nya adalah kita. dan jika kita terpaksa harus mengdisable API KEY tersebut maka aplikasi kita yang running di production tidak dapat menggunakan service google ini.

Bagaimana cara mereka mendapatkan API KEY pada aplikasi.apk kita ?

ok, lets see sample bagaimana orang-orang dapat dengan mudahnya menggunakan API KEY kita jika kita menyimpanya pada hardcode atau pada String.xml di folder /value/string.xml

situs diatas adalah situs yang menyediakan tools untuk menDecompile kembali .apk file menjadi project sebenarnya seperti pada android studio.

Gambar diatas adalah contoh implementasi penyimpanan API KEY yang tidak baik. karena terlalu mudah untuk di ketahui dan digunakan oleh orang lain

ada beberapa cara sebenarnya untuk memberikan keamanan lebih terhadap api key. diantaranya :

Using the Native C++ template

Using CMake

Using ndk-build

sebenarnya ada 2 lagi cara selain cara diatas. yaitu “Build.Config” dan “save API Key di server”

tapi kedua cara tersebut sangat tidak disarankan oleh beberapa developer.

alasannya ??

cara 1 : sangat mudah dan rentan untuk di ketahui value nya oleh reverse Enginering

cara 2 : hal ini menjadi sia-sia. meskipun kelebihannya karna api key nya dapat di set dynamic tergantung response dari server. tapi jika seseorang memiliki end point kita, tentu saja dia dapat kembali melakukan request ke backend dan mendapatkan kembali response api key yang baru

Secure API KEY use NDK

untuk memberikan keaman pada API KEY dengan NDK sangat lah mudah. langsung saja ikuti point to point berikut ini

  1. buat folder bernama “jni” di bawah folder “java”

2. buatlah sebuah file baru bernama “Android.mk” di dalam folder “jni” yang isi nya seperti berikut :

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := api-keys
LOCAL_SRC_FILES := api-keys.c

include $(BUILD_SHARED_LIBRARY)

Note : Tidak ada yang perlu di ubah

3. buat kembali sebuah file baru bernama “Application.mk” yang isi nya seperti berikut ini :

APP_ABI := all

4. buat file baru bernama “api-keys.c” yang isi nya seperti berikut ini :

#include <jni.h>

//For first API key
JNIEXPORT jstring JNICALL
Java_es_hyrax_zonapets_ui_locations_NearbyLocationsActivity_getAPIKey(JNIEnv *env, jobject instance) {

return (*env)-> NewStringUTF(env, "YOUR AWESOME API KEY 1");

}

Note :

es_hyrax_zonapets_ui_locations_ -> adalah nama package (es.hyrax.zonapets.ui.locations.)

NearbyLocationsActivity_ -> adalah nama activity dimana saya ingin memanggil API KEY google

getApikey -> adalah nama external method di activity untuk mendapatkan API KEY

5. Tambahkan externalNativeBuild pada build.gradle (app)

defaultConfig {
.........

}

//for security API KEY
externalNativeBuild {
ndkBuild {
path 'src/main/jni/Android.mk'
}
}

[UPDATE]

dalam beberapa kasuh ternyata terdapat error pada saat menjalankannya. untuk mengatasinya tambahkan kode berikut ini pada

gradle.properties

android.useDeprecatedNdk=true

pada tahap ini kita telah selesai melakukan setup penyimpanan API KEY pada NDK dan tahap selanjutnya adalah bagaimana cara memanggilnya :

pada activity dimana kamu ingin memanggil API KEY maka yang perlu kamu lakukan hanya seperti berikut ini :

class NearbyLocationsActivity : AppCompatActivity() {

init {
System.loadLibrary("api-keys")
}

external fun getAPIKey(): String

val API_KEY = getAPIKey()
...........}
System.loadLibrary("api-keys")

“api-keys” adalah nama file “api-key.c” silahkan sesuaikan

external fun getAPIKey(): String

“getAPIKey()” adalah nama method yang kalian buat pada file “api-key.c” silahkan di sesuaikan dan pastikan penggunaan huruf besar dan kecil nya sama persis

sekarang kamu dapat memanggil API KEY dengan cara cukup memanggil variable API_KEY dan service google pun sudah dapat kamu gunakan tanpa takut lagi jika ada orang yang akan menggunakan API KEY kamu untuk aplikasinya tapi kamu yang menanggung invoice nya

tolong beri saya Claps jika artikel ini bermanfaat untuk kamu :)

Follow just Optional <>