web-dev-qa-db-ja.com

短いOpenPGPキーIDは安全ではありません。代わりに長いキーIDを使用するようにGnuPGを構成するにはどうすればよいですか?

短いOpenPGPキーID(32ビット/ 8桁の16進数文字)は 衝突攻撃 の影響を受けます。 2ビットIDの使用をやめる

32ビットキーIDの使用を停止する

GPUで衝突する32ビットのキーIDを生成するのに4秒かかります( scallion を使用)。キーサーバーはアップロードされたキーの検証をほとんど行わず、32ビットのIDが衝突するキーを許可します。さらに、GPGはインターフェイス全体で32ビットのキーIDを使用し、操作が複数のキーに適用される可能性がある場合に警告を表示しません。

しかし、GnuPGに長いID(64ビット、または16進文字)を使用するように指示するにはどうすればよいですか?

36
Jens Erat

フィンガープリントとロングおよびショートキーIDの関係

各OpenPGP鍵には、主に作成時刻も含む公開鍵パケットから計算されたフィンガープリントが添付されています。計算は RFC 4880、OpenPGP、12.2キーIDと指紋 で定義されています。

指紋の下位32ビットと64ビットに類似した、短いキーIDと長いキーIDがあります。たとえば、OpenPGPキーのIDを確認します。

fingerprint: 0D69 E11F 12BD BA07 7B37  26AB 4E1F 799A A4FF 2279
long id:                                    4E1F 799A A4FF 2279
short id:                                             A4FF 2279

フィンガープリントとキーIDが使用されます。これは、キー全体を通常1024〜8096ビットで共有および比較する(作成日などのヘッダーにさらに追加する)のがvery非実用的です。

長いキーIDの使用

OpenPGP鍵を指定するときはいつでも、短い鍵IDだけでなく、長い鍵IDやフィンガープリント全体を渡すこともできます。短いキーIDを渡す代わりに

gpg --recv-keys A4FF2279

あなたはいつでも長いキーIDを書くことができます

gpg --recv-keys 4E1F799AA4FF2279

または完全なフィンガープリント(スクリプトなどの目的で推奨)

gpg --recv-keys 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279

長いキーIDの印刷

しかし、長いキーIDはどこから取得するのですか?誰かが彼の短いIDを渡した場合、そのIDのすべてのキーを取得しようとする以外に何もできず、衝突がないか確認します(そして、誰もあなたから本当のキーを隠さず、偽のキーだけを渡すことを望みます)。

そのため、OpenPGPキーIDを渡すたびに、長いIDを発表してください! --keyid-format longオプションを追加することで、GnuPGでこれを簡単に印刷できます。

gpg --keyid-format long --list-keys [email protected]

このオプションは、短いキーID(16進数であることを示すために接頭辞0xshortが付いているか付いていない)の場合はshortまたは0xの値を取り、longまたは0xlong長いキーID。

長いキーIDをデフォルトとして設定する

GnuPGが長いキーIDを常に常に印刷していることを確認するには、~/.gnupg/gpg.confファイルに--を取り除いたオプションを追加します。たとえば、次の行を追加して、常に0xで始まる長いキーIDを出力するようにGnuPGを構成しました

keyid-format 0xlong

指紋の印刷

悲しいことに、GnuPGがこの方法で指紋全体を印刷するように設定することはできません。これは、GnuPGの出力フォーマットがほとんどすべての画面サイズで壊れる可能性があるためです。代わりに、実行してリクエストしてください

gpg --fingerprint 4E1F799AA4FF2279

のようなものをダンプします

pub   8192R/0x4E1F799AA4FF2279 2012-12-25
      Key fingerprint = 0D69 E11F 12BD BA07 7B37  26AB 4E1F 799A A4FF 2279

これにはスペースが含まれるという欠点があります(スクリプトで使用するのは悪いことです)。代わりに、コロンで区切られた機械可読な出力を使用できます。

gpg --with-colons --fingerprint 4E1F799AA4FF2279

フィンガープリント以外のすべてをフィルタリングするには、さらにgrepおよびcutを使用します。

gpg --with-colons --fingerprint 4E1F799AA4FF2279 | grep fpr | cut -d ':' -f 10
51
Jens Erat