Saya sedang mengerjakan situs web yang akan memungkinkan pengguna untuk masuk menggunakan kredensial OAuth dari orang-orang seperti Twitter, Google, dll. Untuk melakukan ini, saya harus mendaftar dengan berbagai penyedia ini dan mendapatkan kunci API super rahasia yang saya miliki untuk melindungi dengan janji terhadap berbagai bagian tubuh. Jika kunci saya mendapat gank, bagian akan dicabut.
Kunci API harus bepergian dengan sumber saya, karena digunakan saat runtime untuk melakukan permintaan otentikasi. Dalam kasus saya, kunci harus ada dalam aplikasi dalam file konfigurasi atau dalam kode itu sendiri. Itu tidak masalah ketika saya membangun dan menerbitkan dari satu mesin. Namun, ketika kita melempar kontrol sumber ke dalam campuran, semuanya menjadi lebih rumit.
Karena saya bajingan yang murah, saya lebih suka menggunakan layanan kontrol sumber gratis seperti TFS di cloud atau GitHub. Ini membuat saya sedikit bingung:
Bagaimana saya bisa menjaga tubuh saya tetap utuh ketika kunci API saya ada dalam kode saya, dan kode saya tersedia di repositori publik?
Saya dapat memikirkan sejumlah cara untuk menangani hal ini, tetapi tidak satupun yang memuaskan.
- Saya dapat menghapus semua informasi pribadi dari kode, dan mengeditnya kembali setelah penerapan. Ini akan menjadi sangat sulit untuk diterapkan (saya tidak akan menjelaskan banyak cara), dan bukan pilihan.
- Saya bisa mengenkripsi itu. Tetapi karena saya harus mendekripsi, siapa pun dengan sumbernya dapat mengetahui bagaimana melakukannya. Tak berarti.
- Saya bisa membayar untuk kontrol sumber pribadi. LOL j / k menghabiskan uang? Silahkan.
- Saya dapat menggunakan fitur bahasa untuk memisahkan informasi sensitif dari sumber saya yang lain dan karenanya menjaga dari kontrol sumber. Ini yang saya lakukan sekarang, tetapi bisa dengan mudah dikacaukan dengan memeriksa file rahasia secara keliru.
Saya benar-benar mencari cara yang dijamin untuk memastikan saya tidak membagikan privasi saya dengan dunia (kecuali pada snapchat) yang akan bekerja dengan lancar melalui pengembangan, debugging dan penyebaran dan juga sangat mudah. Ini sama sekali tidak realistis. Jadi apa yang bisa saya lakukan secara realistis?
Detail teknis: VS2012, C # 4.5, kontrol sumber akan menjadi layanan TF atau GitHub. Saat ini menggunakan kelas parsial untuk memisahkan kunci sensitif dalam file .cs terpisah yang tidak akan ditambahkan ke kontrol sumber. Saya pikir GitHub mungkin memiliki keuntungan sebagai .gitignore dapat digunakan untuk memastikan bahwa file kelas parsial tidak diperiksa, tapi saya sudah mengacaukannya sebelumnya. Saya berharap untuk "oh, masalah umum, ini adalah bagaimana Anda melakukannya" tetapi saya mungkin harus puas dengan "yang tidak menyedot sebanyak mungkin",: /
Jawaban:
Jangan memasukkan informasi rahasia Anda ke dalam kode Anda. Masukkan ke dalam file konfigurasi yang dibaca oleh kode Anda saat startup. File konfigurasi tidak boleh diletakkan di kontrol versi, kecuali mereka adalah "default pabrik", dan kemudian mereka tidak boleh memiliki informasi pribadi.
Lihat juga pertanyaan Kontrol versi dan file konfigurasi pribadi untuk cara melakukannya dengan baik.
sumber
Anda bisa meletakkan semua kunci privat / terlindungi sebagai variabel lingkungan sistem. File konfigurasi Anda akan terlihat seperti ini:
Inilah cara kami menangani kasus-kasus itu dan tidak ada yang masuk ke dalam kode. Ini bekerja sangat baik dikombinasikan dengan file dan profil properti yang berbeda. Kami menggunakan file properti yang berbeda untuk lingkungan yang berbeda. Di lingkungan pengembangan lokal kami, kami meletakkan kunci pengembangan di file properti untuk menyederhanakan pengaturan lokal:
sumber
Cara Git murni
.gitignore
termasuk file dengan data pribadiTEMPLATE
denganDATA
TEMPLATE
<->DATA
Cara lincah
TEMPLATE
denganDATA
(perubahan bersifat publik, patch bersifat pribadi)Cara SCM-agnostik
sumber
Saya menaruh rahasia ke file terenkripsi yang kemudian saya komit. Frasa pass diberikan ketika sistem diluncurkan, atau disimpan dalam file kecil yang tidak saya komit. Sangat menyenangkan bahwa Emacs akan dengan riang mengelola file-file terenkripsi ini. Sebagai contoh, file inac emacs termasuk: (memuat "secrets.el.gpg"), yang hanya berfungsi - meminta saya untuk memasukkan kata sandi pada kesempatan langka ketika saya memulai editor. Saya tidak khawatir tentang seseorang yang melanggar enkripsi.
sumber
notes
bidang untuk menyimpan konten file .env. Beberapa bulan yang lalu saya menulis alat yang dapat membaca file keepass dan membuat file .env menggunakannotes
bidang entri. Saya sedang berpikir untuk menambahkan fitur sehingga saya bisa melakukanrequire('switchenv').env()
di bagian atas program Node.js dan membuat variabel process.env berdasarkan entri yang cocok dengan NODE_ENV atau sesuatu seperti itu. -> github.com/christiaanwesterbeek/switchenvIni sangat spesifik untuk Android / Gradle tetapi Anda dapat menentukan kunci di
gradle.properties
file global Anda yang terletak diuser home/.gradle/
. Ini juga berguna karena Anda dapat menggunakan properti yang berbeda tergantung pada buildType atau rasa yaitu API untuk dev dan yang berbeda untuk rilis.properti
build.gradle
Dalam kode Anda akan referensi seperti ini
sumber
Anda tidak seharusnya mendistribusikan kunci itu dengan aplikasi Anda atau menyimpannya di repositori kode sumber. Pertanyaan ini menanyakan bagaimana melakukan itu, dan bukan itu yang biasanya dilakukan.
Aplikasi Web Seluler
Untuk Android / iPhone perangkat harus meminta KUNCI dari layanan web Anda sendiri ketika aplikasi pertama kali dijalankan. Kunci tersebut kemudian disimpan di lokasi yang aman. Haruskah kunci diubah atau dicabut oleh penerbit. Layanan web Anda dapat menerbitkan kunci baru.
Aplikasi Web yang Diinangi
Pelanggan yang menggunakan lisensi perangkat lunak Anda harus memasukkan kunci secara manual saat pertama kali mengkonfigurasi perangkat lunak. Anda dapat memberi semua orang kunci yang sama, kunci yang berbeda atau mereka mendapatkan kunci mereka sendiri.
Kode Sumber yang Diterbitkan
Anda menyimpan kode sumber Anda di repositori publik tetapi bukan KUNCI. Dalam konfigurasi file, Anda menambahkan baris * tombol tempat di sini * . Ketika seorang pengembang menggunakan kode sumber Anda, mereka membuat salinan
sample.cfg
file dan menambahkan kunci mereka sendiri.Anda tidak menyimpan
config.cfg
file Anda digunakan untuk pengembangan atau produksi di repositori.sumber
Gunakan variabel lingkungan untuk hal-hal rahasia yang berubah untuk setiap server.
http://en.wikipedia.org/wiki/Environment_variable
Cara menggunakannya bergantung pada bahasa.
sumber
Saya pikir ini adalah masalah yang setiap orang punya masalah pada suatu saat.
Inilah alur kerja yang telah saya gunakan, yang mungkin cocok untuk Anda. Ini menggunakan .gitignore dengan twist:
Sekarang, Anda dapat mengkloning konfigurasi repo ke sistem pengembangan dan penyebaran apa pun. Cukup jalankan skrip untuk menyalin file ke folder yang benar dan Anda selesai.
Anda masih mendapatkan semua permen GitHub, membagikan kode Anda dengan dunia dan data sensitif tidak pernah ada dalam repo utama, sehingga mereka tidak go public. Mereka masih hanya tarikan dan salinan dari sistem penyebaran apa pun.
Saya menggunakan kotak $ 15 / tahun untuk server private git, tetapi Anda juga dapat mengaturnya di rumah, sesuai persyaratan pelit ;-)
PS: Anda juga bisa menggunakan submitule git ( http://git-scm.com/docs/git-submodule ), tetapi saya selalu lupa perintahnya, aturannya begitu cepat & kotor!
sumber
Gunakan enkripsi, tetapi berikan kunci utama saat startup, sebagai kata sandi di konsol, dalam file yang hanya dapat dibaca oleh pengguna, atau dari penyimpanan kunci yang disediakan sistem seperti gantungan kunci Mac OS atau penyimpanan kunci Windows.
Untuk pengiriman terus-menerus, Anda ingin berbagai kunci direkam di suatu tempat. Konfigurasi harus dibatasi dari kode, tetapi masuk akal untuk menyimpannya di bawah kendali revisi.
sumber
3 Strategi, belum disebutkan (?)
Saat check-in atau dalam kait pra-cek VCS
Strategi sudah disebutkan
sumber
Jauhkan informasi pribadi dari kendali sumber Anda. Buat default yang tidak dimuat untuk distribusi, dan biarkan VCS Anda mengabaikan yang asli. Proses instalasi Anda (apakah manual, configure / build atau wizard) harus menangani membuat dan mengisi file baru. Secara opsional memodifikasi izin pada file untuk memastikan hanya pengguna yang diperlukan (server web?) Yang dapat membacanya.
Manfaat:
Jika Anda sudah melakukan ini dan secara tidak sengaja memeriksanya, tambahkan ke proyek Anda
.gitignore
. Ini akan membuat tidak mungkin dilakukan lagi.Ada yang banyak Git host gratis di sekitar yang menyediakan repositori pribadi. Meskipun Anda seharusnya tidak pernah versi kredensial Anda, Anda bisa murah dan memiliki repo pribadi juga. ^ _ ^
sumber
Alih-alih menyimpan kunci OAuth sebagai data mentah di mana saja, mengapa tidak menjalankan string melalui beberapa algoritma enkripsi, dan menyimpannya sebagai hash asin? Kemudian gunakan file konfigurasi untuk mengembalikannya saat runtime. Dengan begitu kunci tidak disimpan di mana pun, apakah disimpan di kotak pengembangan, atau server itu sendiri.
Anda bahkan dapat membuat API sedemikian rupa sehingga server Anda secara otomatis menghasilkan kunci API asin dan hash baru berdasarkan permintaan, sehingga tidak ada tim Anda yang dapat melihat sumber OAuth.
Sunting: Mungkin mencoba Stanford Javascript Crypto Library , memungkinkan beberapa enkripsi / dekripsi simetris yang cukup aman.
sumber