Aturan pertama keamanan aplikasi: Mesin apa pun yang digunakan penyerang untuk mendapatkan akses fisik atau elektronik tanpa batas kini menjadi milik penyerang Anda, terlepas dari di mana sebenarnya itu atau apa yang Anda bayar untuk itu.
Aturan kedua keamanan aplikasi: Perangkat lunak apa pun yang meninggalkan batas fisik yang tidak dapat ditembus penyerang kini menjadi milik penyerang Anda, terlepas dari berapa lama waktu yang Anda habiskan untuk mengkodekannya.
Aturan ketiga: Setiap informasi yang meninggalkan batas fisik yang sama yang tidak dapat ditembus oleh penyerang sekarang menjadi milik penyerang Anda, tidak peduli betapa berharganya itu bagi Anda.
Fondasi keamanan teknologi informasi didasarkan pada tiga prinsip dasar ini; satu-satunya komputer yang benar-benar aman adalah yang terkunci di dalam brankas, di dalam sangkar Farraday, di dalam sangkar baja. Ada komputer yang menghabiskan sebagian besar umur layanan mereka hanya dalam keadaan ini; setahun sekali (atau kurang), mereka menghasilkan kunci pribadi untuk otoritas sertifikasi akar tepercaya (di depan sejumlah saksi dengan kamera merekam setiap inci ruangan tempat mereka berada).
Sekarang, sebagian besar komputer tidak digunakan dalam lingkungan seperti ini; mereka secara fisik di tempat terbuka, terhubung ke Internet melalui saluran radio nirkabel. Singkatnya, mereka rentan, seperti perangkat lunak mereka. Karena itu mereka tidak dapat dipercaya. Ada hal-hal tertentu yang harus diketahui atau dilakukan oleh komputer dan perangkat lunaknya agar bermanfaat, tetapi kehati-hatian harus dilakukan untuk memastikan bahwa mereka tidak pernah tahu atau berbuat cukup untuk menyebabkan kerusakan (setidaknya bukan kerusakan permanen di luar batas-batas mesin tunggal itu) ).
Anda sudah tahu semua ini; itu sebabnya Anda mencoba melindungi kode aplikasi Anda. Tapi, di situlah letak masalah pertama; alat kebingungan dapat membuat kode berantakan bagi manusia untuk mencoba menggali, tetapi program masih harus dijalankan; itu berarti aliran logika aktual dari aplikasi dan data yang digunakannya tidak terpengaruh oleh kebingungan. Dengan sedikit kegigihan, seorang penyerang bisa dengan mudah menghapus kode, dan itu bahkan tidak perlu dalam kasus-kasus tertentu di mana apa yang dia lihat tidak bisa apa-apa selain apa yang dia cari.
Sebaliknya, Anda harus mencoba memastikan bahwa penyerang tidak dapat melakukan apa pun dengan kode Anda, tidak peduli betapa mudahnya baginya untuk mendapatkan salinan yang jelas. Itu berarti, tidak ada rahasia yang disandikan, karena rahasia itu bukan rahasia begitu kode meninggalkan gedung tempat Anda mengembangkannya.
Nilai kunci ini yang Anda miliki dengan kode-keras harus dihapus dari kode sumber aplikasi sepenuhnya. Sebaliknya, mereka harus berada di salah satu dari tiga tempat; memori volatile pada perangkat, yang lebih sulit (tetapi masih tidak mustahil) bagi penyerang untuk mendapatkan salinan offline; secara permanen di server cluster, di mana Anda mengontrol akses dengan tangan besi; atau di penyimpanan data kedua yang tidak terkait dengan perangkat atau server Anda, seperti kartu fisik atau dalam memori pengguna Anda (artinya itu pada akhirnya akan berada dalam memori yang tidak stabil, tetapi tidak harus lama).
Pertimbangkan skema berikut. Pengguna memasukkan kredensial mereka untuk aplikasi dari memori ke dalam perangkat. Sayangnya, Anda harus percaya bahwa perangkat pengguna belum dikompromikan oleh keylogger atau Trojan; yang terbaik yang dapat Anda lakukan dalam hal ini adalah menerapkan keamanan multi-faktor, dengan mengingat informasi pengidentifikasian yang sulit-palsu tentang perangkat yang telah digunakan pengguna (MAC / IP, IMEI, dll), dan menyediakan setidaknya satu saluran tambahan dengan dimana upaya login pada perangkat yang tidak dikenal dapat diverifikasi.
Kredensial, setelah dimasukkan, dikaburkan oleh perangkat lunak klien (menggunakan hash aman), dan kredensial teks biasa dibuang; mereka telah melayani tujuan mereka. Kredensial yang dikaburkan dikirim melalui saluran aman ke server terautentikasi-sertifikat, yang mem-hashnya lagi untuk menghasilkan data yang digunakan untuk memverifikasi validitas login. Dengan cara ini, klien tidak pernah tahu apa yang sebenarnya dibandingkan dengan nilai database, server aplikasi tidak pernah tahu kredensial plainteks di balik apa yang diterimanya untuk validasi, server data tidak pernah tahu bagaimana data yang disimpan untuk validasi diproduksi, dan seorang pria di tengah hanya melihat omong kosong meskipun saluran aman dikompromikan.
Setelah diverifikasi, server mengirimkan kembali token melalui saluran. Token hanya berguna dalam sesi aman, terdiri dari derau acak atau salinan terenkripsi (dan dengan demikian dapat diverifikasi) dari pengidentifikasi sesi, dan aplikasi klien harus mengirim token ini pada saluran yang sama ke server sebagai bagian dari permintaan apa pun melakukan sesuatu. Aplikasi klien akan melakukan ini berkali-kali, karena tidak dapat melakukan apa pun yang melibatkan uang, data sensitif, atau apa pun yang dapat merusak dengan sendirinya; melainkan harus meminta server untuk melakukan tugas ini. Aplikasi klien tidak akan pernah menulis informasi sensitif ke memori persisten pada perangkat itu sendiri, setidaknya tidak dalam teks biasa; klien dapat meminta server melalui saluran aman untuk kunci simetris untuk mengenkripsi data lokal, yang akan diingat server; dalam sesi berikutnya klien dapat meminta server untuk kunci yang sama untuk mendekripsi data untuk digunakan dalam memori yang mudah menguap. Data itu tidak akan menjadi satu-satunya salinan, baik; apa pun yang disimpan oleh klien juga harus dikirimkan dalam beberapa bentuk ke server.
Jelas, ini membuat aplikasi Anda sangat bergantung pada akses Internet; perangkat klien tidak dapat melakukan fungsi dasar apa pun tanpa koneksi dan otentikasi yang benar oleh server. Tidak berbeda dengan Facebook, sungguh.
Sekarang, komputer yang diinginkan penyerang adalah server Anda, karena itu dan bukan aplikasi / perangkat klien adalah hal yang dapat membuatnya uang atau menyebabkan orang lain kesakitan untuk kesenangannya. Tidak apa-apa; Anda mendapatkan jauh lebih banyak uang untuk pengeluaran uang Anda dan upaya untuk mengamankan server daripada mencoba mengamankan semua klien. Server dapat berada di belakang semua jenis firewall dan keamanan elektronik lainnya, dan juga dapat diamankan secara fisik di balik baja, beton, akses kartu kunci / pin, dan pengawasan video 24 jam. Penyerang Anda harus sangat canggih memang untuk mendapatkan segala jenis akses ke server secara langsung, dan Anda akan (harus) segera mengetahuinya.
Yang terbaik yang bisa dilakukan penyerang adalah mencuri ponsel dan kredensial pengguna dan masuk ke server dengan hak terbatas klien. Jika ini terjadi, seperti halnya kehilangan kartu kredit, pengguna yang sah harus diinstruksikan untuk menelepon nomor 800 (lebih mudah diingat, dan bukan di belakang kartu yang mereka bawa di dompet, dompet atau tas kerja yang bisa jadi dicuri di samping perangkat seluler) dari telepon apa pun yang dapat mereka akses yang menghubungkannya langsung ke layanan pelanggan Anda. Mereka menyatakan ponsel mereka dicuri, memberikan beberapa pengenal unik dasar, dan akun dikunci, setiap transaksi yang mungkin dapat diproses oleh penyerang dibatalkan, dan penyerang kembali ke titik awal.