Contoh ini memiliki sejumlah aspek berbeda. Saya akan menyebutkan beberapa poin yang saya pikir tidak secara eksplisit dibahas di tempat lain.
Melindungi rahasia dalam perjalanan
Hal pertama yang perlu diperhatikan adalah bahwa mengakses API dropbox menggunakan mekanisme autentikasi aplikasi mereka mengharuskan Anda untuk mengirimkan kunci dan rahasia Anda. Koneksi adalah HTTPS yang berarti bahwa Anda tidak dapat mencegat lalu lintas tanpa mengetahui sertifikat TLS. Ini untuk mencegah seseorang mencegat dan membaca paket-paket dalam perjalanan mereka dari perangkat seluler ke server. Untuk pengguna normal, ini adalah cara yang sangat baik untuk memastikan privasi lalu lintas mereka.
Apa yang tidak pandai, adalah mencegah orang jahat mengunduh aplikasi dan memeriksa lalu lintas. Sangat mudah untuk menggunakan proxy man-in-the-middle untuk semua lalu lintas masuk dan keluar dari perangkat seluler. Tidak diperlukan pembongkaran atau rekayasa balik kode untuk mengekstrak kunci aplikasi dan rahasia dalam hal ini karena sifat API Dropbox.
Anda dapat melakukan pinning yang memeriksa bahwa sertifikat TLS yang Anda terima dari server adalah yang Anda harapkan. Ini menambahkan cek ke klien dan membuatnya lebih sulit untuk mencegat lalu lintas. Ini akan membuat lebih sulit untuk memeriksa lalu lintas dalam penerbangan, tetapi pemeriksaan pinning terjadi pada klien, sehingga kemungkinan masih mungkin untuk menonaktifkan tes pinning. Itu memang membuatnya lebih sulit.
Melindungi rahasia saat istirahat
Sebagai langkah pertama, menggunakan sesuatu seperti proguard akan membantu memperjelas di mana rahasia disimpan. Anda juga dapat menggunakan NDK untuk menyimpan kunci dan rahasia dan mengirim permintaan secara langsung, yang akan sangat mengurangi jumlah orang dengan keterampilan yang sesuai untuk mengekstraksi informasi. Kebingungan lebih lanjut dapat dicapai dengan tidak menyimpan nilai-nilai secara langsung dalam memori untuk waktu yang lama, Anda dapat mengenkripsi dan mendekripsi mereka sebelum digunakan seperti yang disarankan oleh jawaban lain.
Opsi lebih lanjut
Jika Anda sekarang paranoid tentang menyimpan rahasia di mana saja di aplikasi Anda, dan Anda punya waktu dan uang untuk berinvestasi dalam solusi yang lebih komprehensif, maka Anda dapat mempertimbangkan menyimpan kredensial di server Anda (anggap Anda punya). Ini akan meningkatkan latensi panggilan apa pun ke API, karena harus berkomunikasi melalui server Anda, dan dapat meningkatkan biaya menjalankan layanan Anda karena peningkatan throughput data.
Anda kemudian harus memutuskan cara terbaik untuk berkomunikasi dengan server Anda untuk memastikan mereka terlindungi. Ini penting untuk mencegah semua masalah yang sama muncul lagi dengan API internal Anda. Aturan praktis terbaik yang bisa saya berikan adalah tidak mengirimkan rahasia apa pun secara langsung karena ancaman lelaki di tengah. Alih-alih, Anda dapat menandatangani lalu lintas menggunakan rahasia Anda dan memverifikasi integritas permintaan apa pun yang datang ke server Anda. Salah satu cara standar untuk melakukan ini adalah dengan menghitung HMAC dari pesan yang dikunci pada sebuah rahasia. Saya bekerja di sebuah perusahaan yang memiliki produk keamanan yang juga beroperasi di bidang ini yang mengapa hal semacam ini menarik minat saya. Sebenarnya, di sini ada artikel blog dari salah satu kolega saya yang membahas sebagian besar dari ini.
Berapa yang harus saya lakukan?
Dengan saran keamanan seperti ini, Anda perlu membuat keputusan biaya / manfaat tentang seberapa keras Anda ingin membuatnya agar bisa didobrak. Jika Anda bank yang melindungi jutaan pelanggan, anggaran Anda sama sekali berbeda dengan seseorang yang mendukung aplikasi di waktu luang. Sebenarnya tidak mungkin untuk mencegah seseorang merusak keamanan Anda, tetapi dalam praktiknya hanya sedikit orang yang membutuhkan semua lonceng dan peluit dan dengan beberapa tindakan pencegahan dasar Anda bisa menempuh jalan panjang.