Bagaimana saya bisa menyembunyikan data rahasia di proyek open source saya?

13

Saya memiliki proyek sumber terbuka yang mengunggah file ke DropBox di antara beberapa host file. Saat ini saya sedang mengikis layar untuk DropBox. Untuk menggunakan API mereka, saya harus membuat kode kunci KUNCI RAHASIA yang diberikan oleh mereka kepada saya untuk otentikasi OAuth. Tapi saya khawatir kuncinya tidak akan menjadi rahasia jika terlihat jelas bagi siapa pun untuk melihatnya.

Adalah mungkin bagi seseorang yang jahat untuk menggunakan kunci saya untuk mengunggah virus ke akun pengguna (yang sudah mengizinkan akses ke aplikasi saya) yang akan menyebar ke pc mereka (jika mereka mengaktifkan sinkronisasi desktop) dan ke pc orang lain (jika mereka memiliki folder bersama) dan sebagainya. :HAI

Saya menemukan pertanyaan yang tidak dijawab ini yang memiliki masalah yang sama dengan saya.

Tapi saya ingin tahu secara umum bagaimana seseorang akan menyembunyikan data rahasia dalam proyek open source.

Saya punya satu ide.

  • Punya placeholder dalam kode sumber seperti "<SECRET KEY HERE>" dan isi hanya ketika membangun biner untuk dirilis? (yuck!)

Ada ide yang bagus?

Vigneshwaran
sumber
1
Itu benar-benar satu-satunya cara aman untuk melakukannya. Anda dapat menggunakan enkripsi pgp untuk menyandikan kunci rahasia Anda juga, maka hanya Anda yang dapat mendekodekannya, tetapi mengapa repot-repot menerbitkannya sama sekali.
Prescott
Mungkin ingin memeriksa pertanyaan ini: programmers.stackexchange.com/questions/180957/... - ini bukan tentang kunci API DropBox, tetapi pesan umumnya sama.
tdammers
git-crypt telah dibuat untuk Anda :) github.com/AGWA/git-crypt
nha

Jawaban:

14

Ide dasarnya adalah bahwa Anda TIDAK memeriksa nilai-nilai rahasia dalam kode atau dalam biner yang dikompilasi. Terutama jika proyeknya adalah open source Anda benar-benar tidak boleh. Ada beberapa strategi konfigurasi yang dapat Anda lakukan untuk melakukannya:

Placeholder dalam kode (nilai hardcoded)

Placeholder dalam kode - seperti yang disarankan - yang paling waras dan termudah untuk dilakukan dalam bahasa pemrograman dinamis karena kode mudah diubah (tanpa perlu dikompilasi). Saya telah melihat banyak proyek open source melakukan ini seperti MediaWiki dengan itu LocalSettings.php.

The downside dengan strategi ini adalah bahwa kunci hardcoded. Jadi jika program ini didistribusikan sebagai biner maka kunci hard-coded tidak membuatnya dapat dipelihara.

File Teks Konfigurasi

Anda juga dapat melakukan ini dengan menerapkan file teks konfigurasi , yaitu program / aplikasi mencari file konfigurasi dan membaca nilai dari itu. Anda dapat check-in konfigurasi sampel dengan placeholder tetapi memiliki konfigurasi lokal yang sebenarnya di mesin Anda.

Dalam kasus Anda, Anda dapat membuat key.conffile teks dengan kunci aktual, biarkan program menggunakan file itu dan biarkan diabaikan oleh kontrol versi. Anda dapat, karena membantu, memeriksa key.conf.examplefile teks dengan kunci palsu dan memeriksa itu. Pastikan program / aplikasi Anda membuat pesan kesalahan yang bermanfaat bagi pengguna untuk menambahkan kunci aktual dalam file yang benar.

Beberapa bahasa pemrograman memiliki API yang menyediakan ini secara otomatis untuk Anda, seperti:

Jika aplikasi Anda adalah aplikasi basis data, maka pertimbangkan untuk memasukkan kunci atau variabel konfigurasi lainnya ke dalam basis data. Itu sama dengan file teks konfigurasi di atas tetapi Anda meletakkan semua variabel konfigurasi seperti kunci dalam tabel database sebagai gantinya.

Melalui tampilan preferensi atau aplikasi Back Office

Jika program adalah jendela atau aplikasi web dengan tampilan maka Anda juga dapat membiarkan aplikasi membuat file konfigurasi, melalui tampilan preferensi. Dengan begitu Anda tidak perlu memeriksa dalam file contoh konfigurasi seperti yang disarankan di atas.

MediaWiki memecahkan masalah ini dengan cara menghasilkan LocalSettings.phpfile secara otomatis dalam proses instalasi awal.

Memang ini bukan pilihan untuk program yang hanya dijalankan sebagai proses latar belakang, layanan atau daemon. Namun itu sebabnya Anda membuat proyek GUI terpisah untuk ini untuk membuat titik masuk pengaturan administrasi dan preferensi, di aplikasi web yang biasanya disebut aplikasi Back Office .

Spoike
sumber
Satu hal yang perlu diperhatikan di sini: Memiliki aplikasi itu sendiri mengubah pengaturan konfigurasinya sendiri berarti file pengaturan harus dapat ditulis oleh pengguna aplikasi, yang pada gilirannya meningkatkan permukaan serangan, jadi Anda harus berpikir keras apakah Anda benar-benar memerlukan UI seperti itu.
tammmer
2

Cara termudah adalah dengan tidak mempublikasikan data rahasia. Beberapa opsi:

  • Gunakan pengganti seperti dalam pertanyaan.
  • Gunakan file header khusus untuk kunci, jangan komit ke kontrol sumber, dan hanya distribusikan secara pribadi ke pihak yang tepercaya.

Saya telah menggunakan opsi kedua untuk pengembangan sumber terbuka karena itu berarti Anda tidak perlu khawatir tentang mengisi rincian sebelum membangun, atau memiliki satu perubahan untuk diingat untuk tidak melakukan komitmen.

Hugo
sumber
2

Jika seseorang memiliki kode sumber (atau kode byte yang dapat direkayasa balik) maka mereka AKAN bisa mendapatkan kunci rahasia dengan menjalankan kode dalam debugger, dan meletakkan break point pada titik di mana Anda mengirim kunci.

Anda dapat membuatnya sedikit lebih sulit dengan memasok pustaka C yang sudah dikompilasi yang berbicara dengan drop box, dengan kunci yang disandikan di dalamnya, tetapi masih ada banyak cara di mana kunci akan bocor (saya berpikir string misalnya).

Satu-satunya cara aman yang bisa saya pikirkan untuk melakukan ini, adalah dengan menyediakan layanan web yang melakukan posting ke drop box. Dengan begitu kunci rahasia tetap ada di server Anda di bawah kendali Anda. Biaya hosting dan bandwidth berarti bahwa solusi ini kurang dari ideal untuk aplikasi gratis, tetapi bonus tambahannya adalah server Anda dapat mengautentikasi klien dengan benar sebelum mengirimkan file mereka ke dropbox.

Michael Shaw
sumber