短いOpenPGPキーID(32ビット/ 8桁の16進数文字)は 衝突攻撃 の影響を受けます。 2ビットIDの使用をやめる :
32ビットキーIDの使用を停止する
GPUで衝突する32ビットのキーIDを生成するのに4秒かかります( scallion を使用)。キーサーバーはアップロードされたキーの検証をほとんど行わず、32ビットのIDが衝突するキーを許可します。さらに、GPGはインターフェイス全体で32ビットのキーIDを使用し、操作が複数のキーに適用される可能性がある場合に警告を表示しません。
しかし、GnuPGに長いID(64ビット、または16進文字)を使用するように指示するにはどうすればよいですか?
各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非実用的です。
OpenPGP鍵を指定するときはいつでも、短い鍵IDだけでなく、長い鍵IDやフィンガープリント全体を渡すこともできます。短いキーIDを渡す代わりに
gpg --recv-keys A4FF2279
あなたはいつでも長いキーIDを書くことができます
gpg --recv-keys 4E1F799AA4FF2279
または完全なフィンガープリント(スクリプトなどの目的で推奨)
gpg --recv-keys 0D69E11F12BDBA077B3726AB4E1F799AA4FF2279
しかし、長いキー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。
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