Gitの重要なファイルの暗号化

ベアリポジトリのリモートサーバーにデータを保存するとします。

サーバースタッフの誠実さに疑問がある場合、または誰かが私たちのプロジェクトをブロックすることを恐れている場合は、会社の最も秘密の技術を表す選択された秘密ファイルを暗号化して、プロジェクトの複製を難しくすることができます。



以下で説明する方法と、無料のGitリポジトリ(GitHubのような)のポリシーおよびライセンス契約との調整については説明しません。これは、特殊性と良心の問題です。



実装では、.gitattributes、ステージング、フィルター(フィルター)、およびPro Git Bookの7.2章を使用します。





これが私たちのやり方です。

私たちにとって2つの重要な状態があります:



画像

状態A



画像

状態B



状態A-gitチェックアウトを行って作業コピーを操作するとき-この時点で、ファイルは解読され、読み取り可能な状態になっているはずです。 このフェーズはステージフィルターによって制御されます。



状態B-作業コピーの変更がリポジトリに送信する準備ができている場合(git add)-この時点で、ファイルを暗号化してからリポジトリに転送する必要があります。 このフェーズは、クリーンフィルターによって制御されます。



通常、ステージとクリーンフェーズは、より穏やかなものに使用されます。たとえば、ソースコードを好みに合わせてフォーマット(インデント)し、送信時に組織が受け入れた標準に合わせます。



リポジトリ(ローカルまたはリモート)に送信する前に、読み取り可能な秘密プロジェクトファイルを取得するには、開発者のマシンで準備する必要があります。



フィルターの説明を〜/ .gitconfigに追加します。



[filter "private"]

clean = ~/git_encode.pl

smudge = ~/git_decode.pl








ホームディレクトリには2つのスクリプトがあります。

SecurePasswordをパスワードに置き換えます。 アセンブリで利用可能なOpenSSLライブラリから選択した暗号化方法を選択します。 rc5を使用しました。



〜/ git_encode.pl:



#!/usr/bin/env perl

use strict;

undef $/;

my $data = <STDIN>;

my $tmp = "/tmp/git.encode.$$." . rand() . ".tmp";

local * O;

open(O,">$tmp");

print O $data;

close(O);

print `openssl enc -rc5 -k SecurePassword -nosalt < $tmp`;

unlink($tmp);








〜/ git_decode.pl:



#!/usr/bin/env perl

use strict;

undef $/;

my $data = <STDIN>;

my $tmp = "/tmp/git.decode.$$." . rand() . ".tmp";

local * O;

open(O,">$tmp");

print O $data;

close(O);

print `openssl enc -d -rc5 -k SecurePassword -nosalt < $tmp`;

unlink($tmp);








これらのスクリプト(コマンドライン)で実行権を設定します。



chmod +x ~/git_encode.pl ~/git_decode.pl







作業ディレクトリで、必要なファイルに保護を接続します。

.gitattributes:



*.m filter=private

*.h filter=private

*.c filter=private

*.cpp filter=private








これで、選択したファイルがリポジトリに送信されると、暗号化プログラムを通過し、復号化プログラムを介して選択されるようになります。

Gitがファイルが変更されるたびに考えないようにするには、暗号化プログラムがファイルを「塩漬け」しないようにします(-nosaltオプションを使用します)。



All Articles