2017-02-24 4 views
5

私は現在、gitコミット署名がどのように正確に動作するのか疑問に思っています。コミット署名はどのように機能しますか?

これを見つけようとしましたが、正確な技術文書が見つかりませんでした。私はgit commitを行う方法を認識していますが、コミットに署名するためにgitが何をしているのか不思議です。

署名されたのは正確ですか?与えられたコミットでリポジトリ内の完全なデータなので、コミットメッセージなどのデータとすべてのファイルのデータ?それとも、インクルードされたファイルへのポインタなどでコミットするだけですか?

+0

をあなたはhttps://git-scm.com/docs/git-tag#git-([署名タグ]について尋ねていますタグ - s)? – Leon

+0

https://help.github.com/articles/signing-commits-with-gpg/ –

+0

@レーオン:私はGPGにどのようなデータが送られているかを知りたいと思っています。これは、意図的なSHA-1の衝突が作成された最近のデモでより面白くなります。 – torek

答えて

2

どこにも記載されていませんが、source codeを調べると、コミットオブジェクトの内容全体が表示されます。これらの内容はに変更され、の署名が挿入されるため、検証プロセスは署名を別のバッファに取り除き、オリジナルの署名前挿入データをGPG署名者に渡す必要があります。

GPGシグネチャデータは、コミットがハッシュIDになるためのSHA-1チェックサムを計算するときに発生します。 gpg-interface.cおよびcommit.c、それぞれsign_bufferおよびdo_sign_commitを参照してください。タグの署名はbuiltin/tag.cです(関数do_signとその呼び出しを参照)。署名されたタグは、挿入されるのではなく署名が追加されますが、そうでない場合は同じように動作します。

+0

私はSHA-1のデモンストレーションからインスピレーションを得たとのあなたの前提は正しいです;) ちょうど私がコードを正しく理解していることを確かめてください(私はJava、Cの人ではありません)。ツリーへのSHA-1参照を含むコミットオブジェクトのみが署名されます。だから私は署名されたコミットがある場合、私はツリーが正しいことを確信することはできませんが、署名者は同じハッシュを持つツリーのコミットを作成しただけですか?それは本当に悲しいです... –

+1

@MarkusKreusch:はい、署名*は、コミットまたはタグオブジェクトの内容のみを直接保護します。しかし、コミットオブジェクトとタグオブジェクトは、(任意のテキストを含むことが許されているにもかかわらず)かなり明白な形をしており、SHA-1を打ち破るための既存のテクニックは明らかなトレースを残しています。ツリーオブジェクトはさらに制限されたフォームを持っています。Gitは不正なツリーを簡単に検出することができます。 BLOBオブジェクトだけが実際に第2プリイメージ攻撃の対象となります。 GitがSHA-256を使い始めることができればうれしいですが、移行はやや粗いでしょう。 – torek

+0

(http://stackoverflow.com/q/42433126/1256452も参照してください。 – torek

0

署名されたgit cat-file(署名が削除された)によって返された未処理のコミットオブジェクトです。 HEADがコミット署名されている場合は、次のように手で署名を検証することができます

git cat-file commit HEAD > signed-commit 
grep -B 9999 'BEGIN PGP SIGNATURE-----' signed-commit | head -n -1 > signed-commit.stripped 
grep -A 9999 'END PGP SIGNATURE-----' signed-commit | tail -n +2 >> signed-commit.stripped 
sed 's/^gpgsig //' signed-commit | sed 's/^ //' > signed-commit.sig 
gpg --verify signed-commit.sig signed-commit.stripped 
関連する問題