Cara terbaik untuk menyembunyikan kunci API dalam kode sumber

12

Saya perlu beberapa ide tentang cara melindungi kunci API pribadi dalam suatu aplikasi, khususnya dalam aplikasi ac # .NET.

Pertama, saya mengerti bahwa secara teori tidak mungkin menyembunyikan apapun dalam kode sumber, jadi saya datang dengan ide lain, tapi saya tidak yakin seberapa masuk akal itu. Bagaimanapun, apakah mungkin untuk berkomunikasi entah bagaimana dengan server web untuk memverifikasi kunci pribadi dan kemudian berbicara kembali ke aplikasi untuk mengkonfirmasi bahwa itu adalah jabat tangan yang sah?

Saya memiliki dua kunci untuk dikerjakan: kunci publik (seperti namanya, itu tidak harus diperlakukan dengan hati-hati sama dengan kunci privat), dan kunci privat, yang perlu diamankan dari orang lain.

Setiap ide tentang bagaimana saya bisa melakukan ini akan sangat dihargai.

Spencer
sumber
4
Apakah Anda mencoba untuk mencegah seseorang yang memiliki akses ke aplikasi biner yang dikerahkan dari membaca kunci (seperti judul Anda menyiratkan), atau melindungi mereka dari memodifikasinya (sesuai dengan gagasan Anda memverifikasi melalui server menyiratkan)? Apa tujuan akhir utama?
gregmac
3
Mungkin bermanfaat untuk menguraikan konsep kunci API untuk pembaca yang tidak terbiasa dengannya. Kunci API adalah rahasia yang diberikan kepada pengembang beberapa perangkat lunak yang berinteraksi dengan layanan (biasanya layanan web). Ini digunakan untuk mengidentifikasi sumber lalu lintas, pembatasan lift vs akses anonim, dan untuk menagih pemilik kunci untuk penggunaan layanan. Anda diharapkan untuk menyembunyikannya secara moderat dan lebih baik mencabutnya jika kompromi. Karena perlu dikomunikasikan secara penuh ke layanan, Anda selalu kalah.
Lars Viklund
@ gregmac Ya, saya mencoba mencegah pengguna aplikasi pihak ketiga membaca kunci.
Spencer
Jangan taruh di sana
CodeART

Jawaban:

13

Untuk meringkas:

  • Anda memiliki kunci API yang dikeluarkan untuk Anda oleh vendor sehingga Anda dapat menggunakan API mereka, dan Anda memiliki kewajiban untuk mencegah kunci ini agar tidak diketahui oleh orang lain
  • Anda membuat panggilan ke API vendor itu (yang memerlukan kunci API) dalam kode aplikasi Anda
  • Anda menyebarkan aplikasi ke sistem di mana pelanggan memiliki akses ke binari dan dengan demikian berpotensi mendekompilasi / mengurangi kode atau memotong lalu lintas

Cara terbaik untuk mencegah kompromi kunci ini adalah dengan tetap mengendalikannya. Ini berarti itu tidak boleh digunakan pada server di mana siapa pun selain Anda bisa membaca biner, dan tidak pernah pergi melalui tautan komunikasi yang tidak Anda kontrol.

Pada akhirnya, jika binari berada di luar kendali Anda, semua yang ada di dalamnya berada di luar kendali Anda. Demikian juga, jika seseorang dapat mencegat lalu lintas, mereka dapat menangkap kunci API ( berpotensi bahkan jika Anda menggunakan SSL ).

Saya dapat melihat dua cara utama untuk mencapai ini, keduanya tidak termasuk kunci API pribadi Anda dalam aplikasi yang Anda gunakan:

Dapatkan kunci API unik untuk setiap penerapan

Ini akan memerlukan beberapa hubungan tambahan dengan vendor, di mana Anda dapat memperoleh kunci atau meminta pelanggan Anda mendapatkan kunci.

Ini sebenarnya sangat umum dengan, misalnya, produk yang menggunakan Google Maps API. Pembuat perangkat lunak memiliki kunci sendiri yang mereka gunakan saat mengembangkan / menjalankan salinan mereka, tetapi mereka tidak memasukkannya dalam perangkat lunak, dan sebaliknya, mengharuskan Anda, sebagai pengguna yang menginstal perangkat lunak tersebut, untuk pergi ke Google dan mendapatkan API Anda sendiri kunci. Perangkat lunak hanya memiliki opsi konfigurasi untuk mengatur kunci Google Maps API untuk digunakan.

Faktanya, banyak vendor yang mengeluarkan kunci API secara kontrak mengharuskan Anda melakukan hal-hal seperti ini, jadi Anda mungkin berada di jalur yang salah, dan ini mungkin satu-satunya solusi yang diizinkan untuk digunakan sesuai dengan Ketentuan Layanan vendor dan / atau kontrak hukum apa pun yang mungkin Anda miliki dengannya.

Gunakan Proxy

Siapkan API proxy, tempat aplikasi Anda memanggil API Anda (di server Anda), dan pada gilirannya, API Anda memanggil API vendor menggunakan kunci tersebut.

Anda mungkin memerlukan perlindungan tambahan pada API Anda, misalnya, sesuatu untuk memastikan hanya aplikasi Anda yang menggunakannya. Ini dapat dilakukan dengan:

  • membuat fungsi tidak spesifik, tetapi aplikasi Anda dapat menggunakannya
  • Daftar putih IP
  • Beberapa mekanisme lisensi / otorisasi yang sudah Anda miliki untuk server Anda
  • Sistem kunci API Anda sendiri tempat Anda dapat mengeluarkan kunci untuk pelanggan Anda

Yang perlu diingat di sini adalah bahwa Anda mungkin tidak diizinkan untuk melakukan ini. Vendor Anda mungkin memiliki Ketentuan Layanan atau kontrak hukum yang mencegah Anda membangun "layanan agregasi" atau proksi, jadi Anda perlu memeriksanya.


Menangani Kelakuan Buruk

Bahkan jika kunci Anda tidak dikompromikan, jika salah satu pelanggan Anda melakukan sesuatu yang menyebabkan vendor memblokir kunci Anda, tiba-tiba SEMUA pelanggan Anda dinonaktifkan, dan satu-satunya perbaikan Anda adalah memperbarui semua orang lain.

Demikian pula, jika Anda ingin memblokir salah satu pelanggan Anda (misalnya, mereka berhenti membayar, telah membajak perangkat lunak, dll) maka Anda tidak dapat melakukannya tanpa mengeluarkan pembaruan kepada orang lain, dan kemudian menonaktifkan kunci.

Logistik ini untuk apa pun di luar segelintir klien akan dengan cepat menjadi tidak bisa dipertahankan.

Apakah Anda bertindak sebagai proxy atau memiliki kunci unik untuk setiap instalasi, Anda dapat menangani situasi ini dengan relatif mudah (dan dengan sedikit atau tanpa dampak kepada orang lain).


Mencoba untuk melindungi kuncinya saat tertanam di dalam perangkat lunak Anda pada akhirnya merupakan upaya yang sia-sia. Apa pun yang Anda lakukan, penyerang apa pun yang memiliki akses ke binari, sumber, dan / atau saluran komunikasi dan cukup bertekad untuk mendapatkannya pada kunci mereka akan dapat melakukannya.

Jadi jangan menanamkannya. "Satu-satunya langkah yang menang bukanlah bermain."

gregmac
sumber
2
+1 untuk "Dapatkan kunci API unik untuk setiap penerapan." Bahkan dapat digunakan bersamaan dengan proxy, memberi Anda kemampuan [terbatas] untuk menonaktifkan kunci / klien nakal.
svidgen
@vidgen Poin yang sangat bagus, saya menambahkan bagian membahas itu. Terima kasih.
gregmac
1
+1, kunci universal hampir selalu akan menggigitmu di ***
Wyatt Barnett
Respon yang sangat mendalam. Sayangnya, saya hanya ditugaskan satu kunci API pribadi sehingga meminta pengguna untuk mengambil kunci tidak mungkin, karena saya di bawah NDA dengan protokol jaringan, dengan demikian alasan untuk kunci pribadi. Proxy mungkin juga keluar dari pertanyaan. Saya mungkin harus menggunakan entah bagaimana mengubahnya menjadi format yang dapat dibaca non-manusia dan meletakkannya di suatu tempat di sumber - bukan pilihan yang bagus, tetapi tidak ada banyak pilihan yang tersisa.
Spencer
5

Jika Anda memiliki kunci dalam kode objek, itu publik untuk definisi. Ada hack di sekitar obfuscator yang dengan cepat mendekompilasi kode objek. Kunci pribadi akan berada di luar kode objek dan di file lain. Bagian yang sulit adalah menyediakan kunci pribadi ini kepada pengguna. Setelah disediakan, Anda dapat menggunakan tanda tangan kunci pribadi, ditempelkan di akhir file, dan kunci publik dalam aplikasi, untuk memverifikasi integritas kunci pribadi. Server web juga dapat melakukan verifikasi ini, jika Anda memiliki saluran komunikasi yang aman.

Frank Hileman
sumber