Edited at

リモートリポジトリの特定のファイルを暗号化しておく

More than 1 year has passed since last update.

git-cryptを使えば、ファイルを暗号化してコミットしてチェックアウト時に復号化するという処理を透過的に(自動で)行えます。暗号化するにはGPG鍵が必要です。クローン時の復号化には基本的にGPG鍵ではなく対称鍵symmetric keyというのを使います。


暗号化


セットアップ

git-crypt init

これを実行すると.git-crypt .git/git-cryptディレクトリが作成され、そこに暗号化・復号化のためのメタデータが入ります。このディレクトリは.gitignoreしてはいけません。


暗号化するファイルを指定する

echo '.secret filter=git-crypt diff=git-crypt' >> .gitattributes

以下のようになっていると思います。


.gitattributes

.secret filter=git-crypt diff=git-crypt


1つめのフィールド.secretの部分は、暗号化されるファイルの名前です。.gitignoreに書くときと同じように書けます。誤って.gitattributes.gitignoreなどのファイルを指定して暗号化してしまわないようにしてください。また、暗号化したいファイルと同時かそれよりも前に、そのファイルのエントリを追加した.gitattributesgit addしてください。そうでないとそのファイルは暗号化されません。

git add .gitattributes


暗号化に使う鍵を指定する

git-crypt add-gpg-user USER_ID

USER_IDの部分に、GPG鍵を特定できる文字列を入れます。フィンガープリントやメールアドレスなど、GPGのmanpageの "HOW TO SPECIFY A USER ID" にあるやり方で指定できます。


暗号化するファイルを追加する

echo 'hello, secret world!' > .secret

git add .secret

あとは普通にコミットしてプッシュすればOKです。おめでとうございます! 当該ファイルは暗号化されたのち送信されますし、ローカルでは生のまま扱えます。


復号化

基本的に自動で復号化されるので、ほとんど気にする必要はありません。特別な手順が必要になるのは、新たにクローンした時だけです。


秘密鍵を使う

git-crypt unlock

クローンしたリポジトリでこれを実行します。そのあとは、プルした時にいちいちアンロックする必要はありません。


対称鍵を使う

秘密鍵を持っていないマシンでも開発する場合や、共同開発者がいる場合などには、以下の手順が必要になります。


対称鍵を生成する

git-crypt export-key /path/to/key

GPGユーザ追加もしくはアンロックを行ったリポジトリでこのコマンドを実行し、生成されたファイルを別のマシンや共同開発者に送ってあげましょう。


対称鍵でアンロックする

git-crypt unlock /path/to/key


その他


  • アンロックされたリポジトリでは、秘密鍵がなくても:


    • 必要なときに自分で対称鍵を生成できるので、貰った対称鍵は削除しても問題ありません

    • 新たなファイルを暗号化して追加できます



  • TravisCIなどでテストする場合はどうするんでしょうか……