Apa praktik terbaik untuk mengamankan API web?

15

Saya perlu membuat API layanan web agar aplikasi seluler kami berinteraksi dengan server & database kami (di ASP.Net MVC 4, tapi itu hampir tidak relevan). Jika sebagian besar tindakan tidak memerlukan pengguna untuk terdaftar pada layanan kami, kami ingin membatasi akses hanya kepada pengguna aplikasi kami.

Apa metode untuk memastikan bahwa panggilan yang dilakukan dari tempat lain (misalnya seseorang yang menginginkan semua data kami, atau membangun aplikasi tidak resmi) ditolak?

Ide awal saya adalah agar perangkat meminta token server, yang dibuat secara acak dan dikirim apa adanya. Semua metode lain akan memeriksa bahwa header permintaan berisi spesifik yang akan hash md5 dari token asin. Server tahu token dan garam dan mampu menghitung hash dan membandingkannya dengan yang dikirim. Selain itu, token sebagai masa hidup terbatas, dan perangkat harus mendapatkan yang lain setiap jam.

Itu tampaknya cukup mudah diimplementasikan dan meskipun mungkin bukan 100% bukti, itu sepertinya ide yang bagus. Bagaimana menurut anda?

Antoine
sumber

Jawaban:

15

Segera setelah Anda merilis aplikasi, itu mungkin direkayasa balik. Ini berarti bahwa tidak ada yang dapat Anda lakukan untuk dilindungi 100% jika aplikasi yang sama (binari yang sama, pengaturan yang sama) didistribusikan ke semua pengguna Anda.

Jika Anda dapat menyesuaikan aplikasi untuk setiap pengguna, maka Anda memiliki kesempatan untuk mungkin tidak melarang beberapa aplikasi lain untuk menggunakan API Anda, tetapi setidaknya membatasi aplikasi ini dengan jumlah permintaan yang dapat dilakukan untuk API.

Bayangkan skema berikut:

  1. Klien menghubungkan dan mengirim pengidentifikasi uniknya (satu pengidentifikasi oleh pengguna).
  2. Server membalas dengan mengirimkan tantangan yang dienkripsi dengan kunci publik. Kunci publik ini dikaitkan dengan pengidentifikasi unik yang sebelumnya dikirim.
  3. Klien memecahkan tantangan dengan mendekripsi data menggunakan kunci pribadi dan mengirimkan rahasia yang didekripsi di balik kembali ke server.
  4. Server memverifikasi bahwa rahasia yang dikirimkan sesuai dengan yang awalnya dibuat.

Pengembang yang akan meretas aplikasi Anda dan berhasil mendapatkan kunci pribadi akan dapat menggunakan API Anda dari aplikasinya sendiri, tetapi ia akan mengidentifikasi dirinya sebagai dirinya sendiri untuk server Anda.

Jika pengguna yang sama dapat melakukan 10.000 permintaan ke API Anda per hari dan rata-rata, pengguna aktif membuat 2.000 permintaan per hari, itu berarti pengembang ini akan dapat menggunakan aplikasi sendiri dan mungkin memberikannya kepada teman-temannya, tetapi dia tidak akan bisa, katakanlah, menjualnya kepada ribuan orang, hanya karena itu akan bekerja hanya untuk beberapa menit di pagi hari.

Meskipun ini membantu, itu bukan 100% bukti juga. Bagaimana jika peretas menemukan cara untuk mengekstrak kunci pribadi dari aplikasi Anda ketika aplikasinya sendiri diinstal pada perangkat?


Catatan tambahan yang tidak menjawab pertanyaan Anda, tetapi masih mungkin bermanfaat: jangan pikirkan API sebagai alat untuk produk utama Anda (aplikasi seluler). Pikirkan itu sebagai produk kelas satu, produk yang mungkin dibayar. Model yang sama digunakan selama bertahun-tahun oleh Amazon dan Google, mulai digunakan secara aktif oleh Microsoft dengan Azure, dll.

Segera setelah Anda mempertimbangkan API bukan sebagai alat sekunder yang dikurangi menjadi perbudakan untuk aplikasi seluler baru Anda yang mengkilap, tetapi produk yang sebenarnya, pada tingkat yang sama dengan aplikasi apa pun yang dilihat pengguna, Anda mulai kurang memikirkan bagaimana melindungi API terhadap penggunaan oleh aplikasi lain, dan lebih lanjut tentang monetisasi API itu sendiri. API semacam itu dapat digunakan oleh aplikasi Anda yang merupakan pelanggannya, atau aplikasi lain apa pun, yang dikembangkan secara bebas oleh siapa saja. Ini memiliki beberapa manfaat:

  • Membuat API sehingga hanya akan digunakan oleh aplikasi Anda sulit dan mahal. Waktu dan uang ini dapat digunakan untuk sesuatu yang lebih bermanfaat.

  • Membuka API Anda untuk umum dapat memiliki manfaat besar bagi Anda dan dunia. Bayangkan Anda adalah arsitek hebat dan pengembang hebat, jadi Anda telah membuat API yang luar biasa hebat, tetapi keterampilan desainer visual Anda payah dan Anda benar-benar tidak mengerti apa pun tentang desain interaksi, dll. Jika Anda menyembunyikan API Anda, satu-satunya Yang akan diketahui orang adalah bahwa Anda telah membuat aplikasi seluler yang tidak dapat digunakan dan jelek. Jika API Anda bersifat publik, pengembang lain akan tertarik dengan kualitasnya dan menulis aplikasi hebat untuknya, memberi Anda banyak uang.

  • Anda tidak pernah membayangkan bagaimana orang lain dapat menggunakan API Anda. Inilah yang terjadi dengan Kinect. Awalnya, Microsoft menciptakan Kinect untuk game. Ketika Microsoft membuka API untuk umum, mereka tidak pernah membayangkan itu akan digunakan beberapa tahun kemudian oleh aplikasi ilmiah, sektor kesehatan, dll. Mirip dengan API web: lebih banyak pengembang yang menggunakannya, lebih luas ide yang akan digunakan.

Arseni Mourzenko
sumber
Jawaban yang sangat menarik. Kita mungkin perlu memikirkan bagaimana kita dapat membuat API publik. Juga untuk referensi, target pasar di Perancis, di mana rekayasa terbalik dan pembongkaran adalah ilegal, jadi kita harus terlalu sibuk dengan ini.
Antoine
2
@Antoine: Revere engineering akan ilegal di negara mana pun segera setelah lisensi melarangnya. Tetapi fakta bahwa itu ilegal tidak berarti bahwa tidak seorang pun akan memuja merekayasa aplikasi Anda.
Arseni Mourzenko