指紋 (公開鍵暗号)

公開鍵暗号において、指紋 (しもん) またはフィンガープリント (英語: fingerprint) とは、公開鍵を識別するための短いバイト列である。指紋は公開鍵に暗号学的ハッシュ関数を適用することで作成される。指紋はこれを作成するのに使用した鍵よりも短いので、鍵の管理作業を単純化することができる。マイクロソフトのソフトウェアでは、拇印 (ぼいん、英語: thumbprint) と呼ばれている。 指紋は通常、以下の手順で作成される。 公開鍵と任意の追加データはバイト列にエンコードされる。同じ指紋を後で確実に再作成できるようにするには、公開鍵に追加するデータを確定した上でエンコードする必要がある。追加データは通常、公開鍵を使用する人が知っておくべき情報で、鍵がどのバージョンのプロトコルを使用するべきか (PGPの指紋の場合)、その鍵の所有者の名前 (X.509のトラストアンカーの場合、追加データはX.509の自己署名証明書からなる) などがある。 作成されたバイト列からSHA-1やSHA-2などの暗号学的ハッシュ関数を使用してハッシュ値を得る。 必要に応じて、暗号学的ハッシュ関数の出力を切り捨てて、短くて便利な指紋を作成することができる。 こうして得られた指紋は、これよりも遥かに長い公開鍵を検証するのに使用することができる。例えば、一般的なRSA公開鍵の長さは2048ビット以上であるが、指紋の長さはSHA-1の場合は160ビット、SHA-256の場合は256ビットである。 指紋が表示されると、通常は16進数の文字列としてエンコードされる。この文字列は読みやすくするために文字のグループに体裁を整えられる。 例えば、SSH用の128ビットのMD5による指紋は次のように表示される: 43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8 インターネットなどの信頼できない手段によって公開鍵を入手した場合、入手した者はその公開鍵を検証することを望む。指紋は短いバイト列なので、これよりも遥かに長い公開鍵を伝えることが困難な信頼できる手段でも伝えることができ、公開鍵の検証を行うことができる。 例えば、アリスがボブの公開鍵を検証したい場合、彼女は電話や直接会うなどの方法でボブと連絡をして、ボブの公開鍵の指紋を読み上げてもらうか、指紋が書かれた紙を渡してもらう。アリスはこの信頼できる指紋が入手した公開鍵のものと一致するかを確認することができる。このように、値を交換して比較することは、値が長い公開鍵ではなく短い指紋である場合には簡単なことである。 指紋は鍵認証データの交換または保管を自動化する場合にも役に立つ。例えば、公開鍵のサイズが問題となる鍵認証データをプロトコルを介して送信するかデータベースに格納する必要がある場合、指紋の交換または保管がより現実的な解決策になる可能性がある。 更に、ユーザーがダウンロードしたばかりの公開鍵を第三者による検索エンジンで確実に見つかるように、指紋を検索エンジンで照会することができる。検索エンジンが適切なサイトにリンクされた指紋を参照して結果を返した場合、中間者攻撃のような攻撃によって、鍵が改竄されていないことにより確信することができる。 PGPには音声による指紋の交換を容易にするためのPGP単語リスト（英語版）を開発した。 SSHなどのシステムでは、ユーザーは指紋を手動で交換および確認を行い鍵認証を行うことができる。ユーザーが他のユーザーの指紋を承認すると、その指紋または公開鍵がそのユーザーの名前かアドレスと共にローカルに保存され、以降のそのユーザーとの通信では自動的に認証されるようになる。 X.509ベースの公開鍵基盤などのシステムでは、指紋は主にルート鍵の認証に使用される。これらのルート鍵は、ユーザー鍵を認証するために使用できる証明書を発行する。証明書をこのように使用することで、ユーザー間の指紋の検証を省くことができる。 PGPやGroove（英語版）などのシステムでは、指紋は以下のような用途で利用することができる。指紋は他のユーザーまたは認証局の鍵の認証に使うことができる。PGPではユーザーが互いに公開鍵に署名しあうことでWeb of trust（英語版）を形成することができ、指紋はこの作業をより簡単に行うために使用されている (例えばキーサインパーティーなど)。 CGA（英語版）やSFS（英語版）や殆どの暗号化P2Pネットワークなどのシステムでは、指紋は既存のアドレスと名前の形式 (IPv6アドレス、ファイル名、その他の識別文字列など) に埋め込まれている。アドレスと名前が信頼できる手段によって交換済みの場合、このアプローチでは指紋をそれらに便乗させることができる。 PGPでは殆どの鍵は「鍵ID」と呼ばれるものが指紋の下位32ビットまたは64ビットと等しくなるように作成されている。PGPでは公開鍵を参照するためにこの鍵IDが使用されている。鍵IDは指紋とは異なるものであり、長さが短いので公開鍵を安全に認証するためには使用できない。現在のハードウェアでは僅か4秒で32ビットの鍵IDを作成できるので、32ビットの鍵IDは使用するべきではない。 指紋のセキュリティに対する主な脅威は、攻撃者が被害者の公開鍵と指紋が一致する鍵ペアを作成する原像攻撃である。攻撃者は被害者に成り済まして被害者の公開鍵の代わりに自身の公開鍵を提示する可能性がある。 一部のシステムに対する二次的な脅威は衝突攻撃である。攻撃者は自身の指紋と一致する複数の鍵ペアを作成する。これによって攻撃者は自分が作成した署名の否認や、その他の混乱を起こす可能性がある。 原像攻撃を防ぐために、指紋に使用される暗号学的ハッシュ関数は、第二原像攻撃耐性を持つ必要がある。衝突攻撃が脅威である場合は、暗号学的ハッシュ関数は衝突耐性も持つべきである。より短くより有用な指紋のために暗号学的ハッシュ関数の出力を切り捨てることは許容できるが、この場合の指紋は力まかせ探索攻撃に対して暗号学的ハッシュ関数の特性を保持するのに十分な長さでなければならない。 実際には、現在使用されている殆どの指紋は、切り捨てられていないSHA-1またはMD5に基づいたものである。2019年時点ではSHA-1とMD5の強衝突耐性は突破されているが、原像攻撃耐性はある。従って、将来的にはSHA-2やSHA-3が利用されるようになる。しかし、これらの出力が長い暗号学的ハッシュ関数に基づく指紋は、SHA-1またはMD5に基づく指紋よりも切り捨てられる可能性が高くなる。 指紋の長さを最小限に抑える必要がある状況では、指紋の計算コストを増やすことで指紋のセキュリティを高めることができる。例えば、CGAでは「ハッシュ拡張」と呼ばれ、誰でも指紋を計算して0から始まるハッシュサムを検索する必要がある。これは高コストな操作だと見做されている。 ^ David Mazières、David Mazi Eres、M. Frans Kaashoek (1998年). “Escaping the Evils of Centralized Control with self-certifying pathnames” (PDF). CiteSeerX. 2019年5月4日閲覧。 ^ “Evil 32: Check Your GPG Fingerprints”. evil32.com. 2019年5月4日閲覧。 ^ Cryptographically Generated Addresses (CGA) (英語). 2005年3月. doi:10.17487/RFC3972. RFC 3972. 2019年5月4日閲覧。 公開鍵暗号 X.509