ゼロ知識コードのホスティング?[閉まっている]


28

オンラインサービスプロバイダーによって保存されたデータの政府による広範囲な監視に関する最近の啓示に照らして、現在、ゼロ知識サービスが大流行しています。

ゼロ知識サービスは、すべてのデータがサーバーに保存されていないキーで暗号化されて保存されるサービスです。暗号化と復号化は完全にクライアント側で行われ、サーバーはプレーンテキストデータまたはキーを認識しません。その結果、サービスプロバイダーは、たとえ暗号化を解除したい場合でも、第三者にデータを解読して提供することはできません。

例を挙げましょう。SpiderOakは、Dropboxのゼロ知識バージョンとして見ることができます。

プログラマとして、私たちはコードのホスティングサービス(Bitbucket、Assemblaなど)の特定のクラスに対して、最も機密性の高いデータ(コード)に大きく依存し、信頼しています。もちろん私はここでプライベートリポジトリについて話しています-ゼロ知識の概念はパブリックリポジトリには意味がありません。

私の質問は:

  1. ゼロ知識コードホスティングサービスを作成するための技術的な障壁はありますか?たとえば、SVN、Mercurial、Gitなどの一般的なバージョン管理システムで使用されるネットワークプロトコルについて、クライアントとサーバー間で通信されるデータを暗号化するスキームの実装を困難(または不可能)にするものがありますか?サーバーが知らないキー?

  2. 今日存在するゼロ知識コードホスティングサービスはありますか?


1
準同型暗号化がなければ、ゼロ知識コードホスティングサイトが、ドロップボックスのゼロ知識バージョンに比べてどのようなメリットをもたらすかはわかりません。安全である(つまり、専門家が信頼できるほど十分に安全である)だけでなく、使用できるほど高速であるようなスキームを誰もまだ考えていないと思います。
ブライアン

2
@AndresF。SpiderOakは、クライアント上で差分生成が発生し、サーバーが暗号化された差分を保存し、差分とベースが暗号化されたときにクライアント上で差分からベースへのアプリケーションが再び発生することを意味します。彼らの言語が非常に不明瞭であることに同意します。
-apsillers

2
@apsillers:または、そのようなコンテンツを意図的にファイルに詰め込み、それを使用してファイル自体を識別することもできます(たとえば、誰かが暗号化を使用して著作権侵害を隠そうとした場合)。
ブライアン

4
これは私が経験したことではありませんが、ゼロ知識コードホスティングサービスを持つための技術的な障壁の1つを想像できます。すべてのユーザーがまったく同じキーを知っている必要はありませんか?その場合、さまざまなレベルのユーザーアクセスを保証する認証メカニズムはどうなりますか?
CB

2
@gnat:推奨を求めているわけではありません。私が説明した種類のサービスが存在するかどうかを尋ねているだけです。そのようなサービスの存在は、この質問の前半で私が尋ねる技術的障壁が克服可能であるという証拠を提供します。
HC4-モニカを

回答:


3

各行を個別に暗号化できます。ファイル名、おおよその行の長さ、行の変更が発生する行番号を漏らす余裕がある場合は、次のようなものを使用できます。

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

各行は別々に(ただし同じキーで)暗号化されるため、アップロードされた変更には(通常のように)関連する行のみが含まれます。

現在十分に便利でない場合は、2つのGitリポジトリを作成できます。1つはプレーンテキストで、もう1つは暗号テキストです。プレーンテキストリポジトリ(ローカル)でコミットする場合、コミットフックはdiffを取得し、上記で参照したラインエンクリプターを介して実行し、暗号化テキストリポジトリに適用します。暗号文リポジトリの変更がコミットされ、アップロードされます。

上記の行暗号化はSCMに依存しませんが、(プレーンテキストの)統合されたdiffファイルを読み取り、変更を暗号化して暗号文に適用できます。これにより、統合された差分(Gitなど)を生成するSCMで使用できるようになります。


これにはgitのスマッジクリーンを使用できませんか?
svick

@svick:可能ですが、その方法では、ファイル全体を再暗号化することをうまく回避する方法がわかりません。しかし、もちろん、ファイルサイズが小さいため、コードにとってはそれほど重要ではありません。ただし、「ライン暗号化」は必要ありません。暗号化ツールを使用できます。
ヤヌス

多くのテキストサンプル(既知の構造を持つ)は、キーを攻撃しやすくするものではないでしょうか?すべての空白行は同じものを暗号化します。javadocの開始と終了はすべて同じです。これで、使用できるコードの一部のクリアテキストと暗号テキストがわかりました。これは、愛好家以外には役に立たない可能性があります(暗号化の種類が訓練されているか、十分な計算能力がある人は、十分な労力でそれを破ることができます)。

@MichaelT:いいえ、IVのためです。自分で試してみてください:)リンクされた実装を使用して、行をに暗号化し<IV>,<ciphertext>ます
ヤヌス

1
@svick:行は個別に暗号化されます。あなたが行を変更した場合、全体のラインは、再暗号化になるだろうが、新しいIVと(いつものように)。ただし、ファイルの残りの部分は変更されません。暗号化は決定論的ですが、IVも入力であり、疑似ランダムに選択されます。
ヤヌストロエルセン

1

障壁はないと思います-SVNを検討してください。ストレージのためにサーバーに送信されるのは、コードの以前のバージョンと現在のバージョンの差分です。したがって、1行を変更すると、その行だけがサーバーに送信されます。サーバーは、データ自体を検査せずに「ブラインド」で保存します。デルタを暗号化して代わりに送信した場合、サーバーに影響はありません。実際、サーバーをまったく変更する必要さえありません。

簡単に暗号化できないメタデータプロパティ(MIMEタイプなど)など、重要な可能性のあるビットがありますが、他のビットは暗号化できます。たとえば、履歴ログのコメントは、表示するクライアント。ディレクトリ構造が表示されるかどうかはわかりませんが、SVNがディレクトリを保存する方法のために表示されないと思いますが、その可能性は間違っています。ただし、コンテンツが安全であれば、これは重要ではありません。

つまり、さまざまなコードビュー機能を備えたWebサイトを作成できず、サーバー側のリポジトリブラウザーやログビューアーを使用できません。コードの差分はなく、オンラインのコードレビューツールもありません。

このようなものがすでに存在します。Mozyはデータをプライベートキーで暗号化して保存します(独自のキーを使用できます。また、「キーを紛失した場合、データを復元できないため、あなた」ですが、それはより一般的なユーザーを対象としています)。Mozyはファイルの履歴も保存するため、以前のバージョンを取得できます。落ちてくるのは、アップロードが定期的に行われることであり、必要なときにチェックインすることではありません。また、ストレージスペースが不足すると古いバージョンが破棄されると思います。しかし、コンセプトはそこにあり、既存のシステムを使用して安全なソース管理を提供するために変更することができます。


Re:「これは、さまざまなコードビュー機能を備えたWebサイトを作成できなかったことを意味します。サーバー側のリポジトリブラウザーやログビューアーはありません。コードの差分やオンラインコードレビューツールはありません。」-アプリケーションロジックがクライアント側のJSにあり、パスワード/キーを入力させた場合(ただし、サーバーに送信しなかった場合)、これらを保持できますか?
HC4-モニカを

はい、できます。...暗号化されたデータをネットワーク経由で受信していることがわかっていれば、何でもできます。データを解読できないのはサーバーの明らかな制限です。
gbjbaanb

1

私はそれらの「これはあなたの質問に答えるつもりはない」のいずれかをするのが嫌いです。

これらの心配に対処する2つの準備ができたソリューションを考えることができます。

  1. 自分でプライベートGitサーバーをホストします。次に、チームメンバーにアクセスを許可するVPNにそのサーバーを配置します。サーバーとのすべての通信は暗号化されます。もちろん、OSレベルでサーバーを暗号化できます。

  2. BitSyncも同様のトリックを行う必要があります。すべてが暗号化され、どこからでも利用できる巨大なネットワークになります。実際には、このすべてのBitCoin / BitMessage / BitSyncテクノロジーの本当に優れたアプリケーションかもしれません。

最後に、https: //security.stackexchange.com/にいる人々は、もう少し洞察を持っているかもしれません。


BitSyncについて:バージョン管理システムの代替として使用することを提案していますか、それともバージョン管理システムと一緒に使用することを提案していますか?前者の場合、確かですが、それはあまり面白くないです。SpiderOakでファイルを共有することもできますが、それは一元化されますが、それでも知識はありません。後者の場合、どのように?
HC4-モニカを

1
@ HighCommander4試したことはありませんが、動作しない理由はありません'git push ./syncedFolderActingAsServer/MyAwesomeProject/src/'。gitレベルのアクセス許可などを行うこともできます。誰かがこれを試してみてください!
ラバーダック

1

私が理解しているように、git pull動作する方法は、サーバーがあなたに必要なすべてのオブジェクトを含むが現在は持っていないパックファイルを送信することです。およびその逆も同様ですgit push

このように直接行うことはできなかったと思います(これは、サーバーがオブジェクトを理解する必要があるためです)。代わりにできることは、一連の暗号化されたパックファイルでサーバーを動作させることです。

そのためにはpull、前回以降に追加されたすべてのパックファイルをダウンロードし、pullそれらを復号化してgitリポジトリに適用します。行うにはpush、まずpullサーバーの状態を知るために行う必要があります。競合がない場合は、変更を含むパックファイルを作成し、暗号化してアップロードします。

このアプローチでは、非常に非効率的な多数の小さなパックファイルが作成されます。これを修正するには、一連のパックファイルをダウンロードし、復号化し、1つのパックファイルに結合し、暗号化してサーバーにアップロードし、そのシリーズの代替としてマークします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.