
git-cryptは、gitリポジトリ内のファイルの透過的な暗号化と復号を可能にします。保護対象として選択したファイルはコミット時に暗号化され、チェックアウト時に復号されます。git-cryptを使用すると、公開コンテンツと非公開コンテンツが混在したリポジトリを自由に共有できます。git-cryptは優雅に機能低下するため、秘密鍵を持たない開発者でも、暗号化されたファイルを含むリポジトリのクローン作成やコミットが可能です。これにより、秘密情報(キーやパスワードなど)をコードと同じリポジトリに保存でき、リポジトリ全体をロックダウンする必要がなくなります。
git-cryptはAndrew Ayer([email protected])によって作成されました。 詳細については、https://www.agwa.name/projects/git-cryptを参照してください。
INSTALL.mdファイルを参照してください。
リポジトリをgit-cryptで設定する:
cd repo
git-crypt init
.gitattributesファイルを作成して暗号化するファイルを指定する:
secretfile filter=git-crypt diff=git-crypt
*.key filter=git-crypt diff=git-crypt
secretdir/** filter=git-crypt diff=git-crypt
.gitignoreファイルと同様に、ワイルドカードにマッチし、リポジトリにチェックインする必要があります。.gitattributesの詳細については後述します。誤って.gitattributesファイル自体(または.gitignoreや.gitmodulesなどの他のgitファイル)を暗号化しないように注意してください。機密ファイルを追加する前に.gitattributesルールを設定してください。そうしないと、それらのファイルは暗号化されません!
GPGを使用してリポジトリを他の人(または自分自身)と共有する:
git-crypt add-gpg-user USER_ID
USER_IDには、キーID、完全なフィンガープリント、メールアドレス、またはGPGに対して公開鍵を一意に識別できるものであれば何でも指定できます(gpgマニュアルページの「HOW TO SPECIFY A USER ID」を参照)。注意: git-crypt add-gpg-userは、リポジトリのルートにある.git-cryptディレクトリにGPG暗号化されたキーファイルを追加してコミットします。
または、対称秘密鍵をエクスポートし、それを安全に共同作業者に伝えることもできます(GPGは不要で、リポジトリにファイルは追加されません):
git-crypt export-key /path/to/key
暗号化されたファイルを含むリポジトリをクローンした後、GPGでロックを解除する:
git-crypt unlock
または対称鍵を使用する:
git-crypt unlock /path/to/key
これだけです。git-cryptを設定(git-crypt initまたはgit-crypt unlock)した後は、通常通りgitを使用できます。暗号化と復号は透過的に行われます。
git-cryptの最新バージョンは0.8.0で、2025年9月23日にリリースされました。git-cryptはバグがなく信頼性が高く、クラッシュ、誤動作、機密データの漏洩がないことを目指しています。ただし、まだ成熟には至っておらず、文書化、機能の充実、使いやすさの面で十分ではない可能性があります。さらに、バージョン1.0より前に後方互換性のない変更が導入される可能性があります。
git-cryptは、他の透過的なgit暗号化システムよりも安全です。git-cryptは、ファイルのSHA-1 HMACから派生した合成IVを使用して、CTRモードのAES-256でファイルを暗号化します。この動作モードは、決定論的選択平文攻撃に対して意味的に安全であることが証明されています。つまり、暗号化は決定論的ですが(gitがファイルの変更の有無を区別できるようにするために必要)、2つのファイルが同一かどうか以外の情報は漏洩しません。他の透過的なgit暗号化の提案では、固定IVのECBまたはCBCを使用しています。これらのシステムは意味的に安全ではなく、情報を漏洩します。
git-cryptはgitフィルターに依存していますが、gitフィルターは暗号化を意図して設計されていません。そのため、git-cryptはリポジトリ内のほとんどのファイルまたはすべてのファイルを暗号化するのに最適なツールではありません。git-cryptが真価を発揮するのは、リポジトリのほとんどが公開で、いくつかのファイル(たとえば*.keyという名前の秘密鍵やAPI認証情報を含むファイル)を暗号化する必要がある場合です。リポジトリ全体を暗号化するには、代わりにgit-remote-gcryptのようなシステムを使用することを検討してください。(注:git-remote-gcryptのセキュリティを推奨するものではありません。)
git-cryptは、ファイル名、コミットメッセージ、シンボリックリンクターゲット、gitlink、その他のメタデータを暗号化しません。
git-cryptは、ファイルが変更されたかどうか、ファイルの長さ、または2つのファイルが同一であるという事実を隠しません(上記「セキュリティ」セクションを参照)。
git-cryptは、以前に許可された暗号化リポジトリへのアクセスを取り消すことをサポートしていません。これは、マルチユーザーGPGモード(add-gpg-userを補完するdel-gpg-userコマンドがない)と対称鍵モード(鍵のローテーションをサポートしていない)の両方に適用されます。これは、履歴データの文脈において本質的に複雑な問題だからです。たとえば、履歴のある時点で鍵がローテーションされても、以前の鍵を持つユーザーは以前のリポジトリ履歴にアクセスできます。この問題は、https://github.com/AGWA/git-crypt/issues/47でより詳細に議論されています。
git-cryptで暗号化されたファイルは圧縮できません。暗号化されたファイルにごく小さな変更を加えても、gitはデルタではなく変更されたファイル全体を保存する必要があります。
git-cryptはSHA-1 HMACで個々のファイルの内容を保護しますが、リポジトリ全体が改ざんから保護されていない限り、git-cryptを安全に使用することはできません(リポジトリを改ざんできる攻撃者は.gitattributesファイルを変更して暗号化を無効にできます)。必要に応じて、完全性をgit-cryptだけに依存するのではなく、署名付きタグなどのgit機能を使用してください。
git-cryptで暗号化されたファイルは、パッチ自体が暗号化されていない限り、git-applyでパッチを適用できません。暗号化されたパッチを生成するには、git diff --no-textconv --binaryを使用します。または、patchコマンドを使用してgitの外部で平文パッチを適用することもできます。
git-cryptは、一部のサードパーティ製git GUI(Atlassian SourceTreeやGitHub for Macなど)では安定して動作しません。ファイルが暗号化されていない状態のままになる可能性があります。
.gitattributesファイルは、gitattributes(5)マニュアルページに文書化されています。ファイルパターン形式は.gitignoreで使用されるものと同じで、gitignore(5)マニュアルページに文書化されています。ただし、単にディレクトリ(例:/dir/)を指定するだけでは、その下にあるすべてのファイルを暗号化するには不十分です。
また、パターンdir/*はdir/のサブディレクトリ内のファイルにはマッチしないことに注意してください。サブツリーdir/全体を暗号化するには、dir/**を使用します:
dir/** filter=git-crypt diff=git-crypt
.gitattributesファイルは暗号化してはいけません。ワイルドカードが誤ってマッチしないように注意してください。必要に応じて、次のように.gitattributesを暗号化から除外できます:
.gitattributes !filter !diff