Hosting kode nol pengetahuan? [Tutup]

28

Dalam terang wahyu baru-baru ini tentang pemantauan pemerintah luas data yang disimpan oleh penyedia layanan online, layanan nol-pengetahuan adalah semua sekarang marah.

Layanan tanpa pengetahuan adalah layanan tempat semua data disimpan dienkripsi dengan kunci yang tidak disimpan di server. Enkripsi dan dekripsi terjadi sepenuhnya di sisi klien, dan server tidak pernah melihat data plaintext atau kunci. Akibatnya, penyedia layanan tidak dapat mendekripsi dan memberikan data kepada pihak ketiga, bahkan jika itu diinginkan.

Sebagai contoh: SpiderOak dapat dilihat sebagai versi Dropbox tanpa pengetahuan.

Sebagai programmer, kami sangat bergantung pada, dan mempercayai beberapa data kami yang paling sensitif - kode kami - untuk kelas penyedia layanan online tertentu: penyedia kode hosting (seperti Bitbucket, Assembla, dan sebagainya). Saya tentu saja berbicara tentang repositori pribadi di sini - konsep nol-pengetahuan tidak masuk akal untuk repositori publik.

Pertanyaan saya adalah:

  1. Apakah ada hambatan teknologi untuk membuat layanan hosting kode pengetahuan nol? Misalnya, apakah ada sesuatu tentang protokol jaringan yang digunakan oleh sistem kontrol versi populer seperti SVN, Mercurial, atau Git yang akan menyulitkan (atau tidak mungkin) untuk mengimplementasikan skema di mana data yang dikomunikasikan antara klien dan server dienkripsi dengan kunci server tidak tahu?

  2. Apakah ada layanan hosting kode nol pengetahuan yang ada saat ini?

HC4 - mengembalikan Monica
sumber
1
Tanpa enkripsi homomorfik , saya tidak melihat bagaimana situs hosting kode pengetahuan nol bisa memberikan segala jenis manfaat dibandingkan versi drop-box versi nol pengetahuan. Saya tidak percaya ada orang yang datang dengan skema yang aman (yaitu, cukup aman sehingga para ahli mempercayainya) dan cukup cepat untuk dapat digunakan.
Brian
2
@AndresF. Saya hanya dapat berasumsi bahwa SpiderOak berarti bahwa pembangkitan terjadi pada klien, server menyimpan diff yang dienkripsi, dan kemudian aplikasi diff-to-base muncul lagi pada klien ketika diff dan basis dienkripsi. Saya setuju bahwa bahasa mereka sangat tidak jelas.
apsillers
2
@apsillers: Atau Anda dapat dengan sengaja memasukkan konten tersebut ke dalam file dan menggunakannya untuk mengidentifikasi file itu sendiri (misalnya, jika seseorang mencoba menggunakan enkripsi untuk menyembunyikan pembajakan).
Brian
4
Ini bukan sesuatu yang saya punya pengalaman dalam, tetapi saya bisa membayangkan satu hambatan teknologi yang mungkin untuk memiliki layanan hosting kode pengetahuan nol: tidak akan semua pengguna perlu tahu / menggunakan kunci yang sama persis? Dan jika itu masalahnya, apa yang akan menjadi mekanisme otentikasi yang memastikan berbagai tingkat akses pengguna?
CB
2
@gnat: Saya tidak meminta rekomendasi. Saya hanya bertanya apakah layanan seperti yang saya jelaskan ada. Keberadaan layanan seperti itu akan memberikan bukti bahwa hambatan teknologi yang saya tanyakan sebelumnya dalam pertanyaan itu bisa diatasi.
HC4 - mengembalikan Monica

Jawaban:

3

Anda dapat mengenkripsi setiap baris secara terpisah. Jika Anda mampu membocorkan nama file dan perkiraan panjang garis serta nomor baris tempat perubahan garis terjadi, Anda dapat menggunakan sesuatu seperti ini:

https://github.com/ysangkok/line-encryptor

Karena setiap baris dienkripsi secara terpisah (tetapi dengan kunci yang sama), perubahan yang diunggah akan (seperti biasanya) hanya melibatkan baris yang relevan.

Jika saat ini tidak cukup nyaman, Anda bisa membuat dua repositori Git, satu dengan plaintext dan satu dengan ciphertext. Ketika Anda komit dalam repositori plaintext (yang bersifat lokal), sebuah hook komit bisa mengambil diff dan menjalankannya melalui jalur enkripsi yang dirujuk di atas, yang akan menerapkannya ke repositori ciphertext. Perubahan repositori ciphertext akan dilakukan dan diunggah.

Enkripsi baris di atas adalah SCM agnostik, tetapi dapat membaca file-file berbeda yang disatukan (dari plaintext) dan mengenkripsi perubahan dan menerapkannya pada ciphertext. Ini membuatnya dapat digunakan pada SCM apa pun yang akan menghasilkan Anda sebuah unified diff (seperti Git).

Janus Troelsen
sumber
Tidak bisakah Anda menggunakan noda-noda git untuk ini?
svick
@vick: Anda bisa, tetapi dengan cara itu, saya tidak melihat bagaimana Anda dengan baik mengizinkan menghindari mengenkripsi ulang seluruh file. Tapi tentu saja, itu tidak masalah untuk kode karena ukuran file kecil. Tetapi tidak perlu untuk "line mengenkripsi", Anda bisa menggunakan alat enkripsi apa saja.
Janus Troelsen
Bukankah banyak sampel teks (dengan struktur yang diketahui) menjadi sesuatu yang akan membuatnya lebih mudah untuk menyerang kunci? Setiap baris kosong akan mengenkripsi sama. Setiap awal dan akhir javadoc akan sama. Sekarang Anda tahu teks yang jelas dan teks sandi untuk beberapa segmen kode yang dapat digunakan. Hal ini kemungkinan tidak akan berguna untuk melawan apa pun kecuali penggemar (siapa pun dengan jenis kripto terlatih atau daya komputasi yang cukup dapat mematahkannya dengan upaya yang cukup).
@MichaelT: Tidak, karena IV. Cobalah sendiri :) Menggunakan implementasi tertaut, baris akan dienkripsi <IV>,<ciphertext>.
Janus Troelsen
1
@svick: Garis dienkripsi secara individual. Jika Anda mengubah baris, seluruh baris akan dienkripsi ulang, tetapi dengan IV baru (seperti biasa). Tetapi sisa file tidak akan disentuh! Enkripsi bersifat deterministik, tetapi IV juga merupakan input, dan mereka dipilih secara acak semu.
Janus Troelsen
1

Saya tidak berpikir ada hambatan - pertimbangkan SVN, apa yang dikirim ke server untuk penyimpanan adalah delta antara versi kode Anda sebelumnya dan saat ini - jadi Anda mengubah 1 baris, hanya baris yang dikirim ke server. Server kemudian 'membabi buta' menyimpannya tanpa melakukan pemeriksaan data itu sendiri. Jika Anda mengenkripsi delta dan mengirimnya sebagai gantinya, tidak akan ada dampak pada server, bahkan Anda bahkan tidak perlu memodifikasi server sama sekali.

Ada bit lain yang mungkin penting, seperti properti data meta yang tidak mudah dienkripsi - seperti tipe mime - tetapi yang lain bisa dienkripsi, misalnya komentar di log riwayat, asalkan Anda tahu Anda harus mendekripsi mereka di klien untuk melihat. Saya tidak yakin apakah struktur direktori akan terlihat, saya pikir itu tidak akan terlihat karena cara SVN menyimpan direktori, tetapi kemungkinannya saya salah. Ini mungkin tidak masalah bagi Anda jika isinya aman.

Ini berarti Anda tidak dapat memiliki situs web dengan berbagai fitur tampilan kode, tidak ada browser repositori di sisi server atau penampil log. Tidak ada perbedaan kode, tidak ada alat peninjau kode online.

Sesuatu seperti ini sudah ada, sampai titik tertentu, Mozy menyimpan data Anda dienkripsi dengan kunci pribadi Anda (Anda dapat menggunakan sendiri, dan mereka membuat suara tentang "jika Anda kehilangan kunci Anda sendiri, terlalu buruk, kami tidak dapat mengembalikan data Anda untuk Anda ", tetapi itu lebih ditargetkan pada pengguna umum). Mozy juga menyimpan riwayat file Anda, sehingga Anda dapat mengambil versi sebelumnya. Di mana itu jatuh adalah bahwa unggahan adalah secara teratur, bukan checkin ketika Anda inginkan, dan saya percaya itu membuang versi lama ketika Anda kehabisan ruang penyimpanan. Tapi konsepnya ada, mereka bisa memodifikasinya untuk memberikan kontrol sumber yang aman menggunakan sistem yang ada

gbjbaanb
sumber
Re: "Ini berarti Anda tidak dapat memiliki situs web dengan berbagai fitur tampilan kode, tidak ada browser repositori di sisi server atau penampil log. Tidak ada perbedaan kode, tidak ada alat peninjau kode online." - Anda masih bisa memilikinya jika logika aplikasi berada di JS sisi klien dan itu membuat Anda memasukkan kata sandi / kunci Anda (tetapi tidak mengirimkannya ke server), bukan?
HC4 - mengembalikan Monica
Ya, itu bisa .... Apa pun asalkan tahu itu menerima data terenkripsi melalui jaringan. Ini hanya batasan yang jelas dari server sehingga tidak dapat mendekripsi data.
gbjbaanb
1

Aku benci melakukan salah satu dari jawaban 'ini tidak akan menjawab pertanyaanmu' ... tapi ..

Saya dapat memikirkan dua solusi siap yang harus mengatasi kekhawatiran ini.

  1. Host server Git pribadi Anda sendiri. Kemudian taruh server itu pada VPN yang Anda beri akses anggota tim Anda. Semua komunikasi ke dan dari server akan dienkripsi, dan Anda tentu saja dapat mengenkripsi server di tingkat OS.

  2. BitSync harus melakukan triknya juga. Semuanya akan dienkripsi, dan dalam jaringan besar yang akan tersedia dari mana saja. Mungkin sebenarnya aplikasi yang sangat bagus dari semua teknologi BitCoin / BitMessage / BitSync ini ..

Terakhir, orang-orang di https://security.stackexchange.com/ mungkin memiliki lebih banyak wawasan.

Bebek karet
sumber
Mengenai BitSync: apakah Anda menyarankan BitSync digunakan sebagai pengganti sistem kontrol versi, atau entah bagaimana digunakan bersama dengan sistem kontrol versi? Jika yang pertama, maka pasti, tapi itu tidak terlalu menarik. Saya bisa saja berbagi file melalui SpiderOak dan itu akan terpusat, tetapi masih nol pengetahuan. Jika yang terakhir, lalu bagaimana?
HC4 - mengembalikan Monica
1
@ HighCommander4 Belum mencobanya, tetapi seharusnya tidak ada alasan untuk itu tidak berfungsi .. Tidak bisakah Anda mengatur sinkronisasi untuk membagikan folder git yang diinisialisasi, kemudian lakukan yang normal 'git push ./syncedFolderActingAsServer/MyAwesomeProject/src/'? Anda juga dapat melakukan izin level git, dll. Seseorang harus mencoba ini!
Bebek Karet
1

Seperti yang saya pahami, cara git pullkerjanya adalah server mengirimi Anda file paket yang berisi semua objek yang Anda inginkan, tetapi saat ini tidak. Dan sebaliknya untuk git push.

Saya pikir Anda tidak dapat melakukannya seperti ini secara langsung (karena ini berarti server harus memahami objek). Yang bisa Anda lakukan adalah membiarkan server bekerja hanya dengan serangkaian file paket terenkripsi.

Untuk melakukannya pull, Anda mengunduh semua file paket yang ditambahkan sejak terakhir pull, mendekripsi dan menerapkannya ke git repo Anda. Untuk melakukannya push, Anda harus terlebih dahulu melakukannya pull, sehingga Anda mengetahui keadaan server. Jika tidak ada konflik, Anda membuat file paket dengan perubahan Anda, mengenkripsi dan mengunggahnya.

Dengan pendekatan ini, Anda akan berakhir dengan sejumlah besar file paket kecil, yang akan sangat tidak efisien. Untuk memperbaikinya, Anda bisa mengunduh serangkaian file paket, mendekripsi, menggabungkannya menjadi satu file paket, mengenkripsi dan mengunggahnya ke server, menandainya sebagai pengganti untuk seri itu.

svick
sumber