指紋 (公開鍵暗号)

公開鍵暗号における指紋(フィンガープリント)



公開鍵暗号において、指紋またはフィンガープリントとは、公開鍵を識別するために用いられる短いバイト列のことです。これは、公開鍵に暗号学的ハッシュ関数を適用することで生成されます。指紋は、元の公開鍵よりも遥かに短い長さであるため、鍵の管理作業を効率化することができます。マイクロソフトのソフトウェアでは、この指紋のことを「拇印 (thumbprint)」と呼んでいます。

指紋の作成手順



指紋は、一般的に以下の手順で作成されます。

1. 公開鍵と追加データのエンコード: 公開鍵と、必要に応じて追加のデータをバイト列に変換します。同一の指紋を確実に再生成するためには、公開鍵に付加するデータを事前に決定しておく必要があります。この追加データには、例えば、PGPの指紋の場合には鍵がどのバージョンのプロトコルを使用するべきか、X.509のトラストアンカーの場合には鍵の所有者の名前など、鍵の利用者が知っておくべき情報が含まれます。X.509では、追加データは自己署名証明書から構成されます。
2. ハッシュ値の生成: エンコードされたバイト列に対して、SHA-1やSHA-2のような暗号学的ハッシュ関数を適用し、ハッシュ値を得ます。
3. ハッシュ値の切り捨て: 必要に応じて、ハッシュ関数の出力を切り捨て、より短く利便性の高い指紋を作成します。例えば、SHA-1であれば160ビット、SHA-256であれば256ビットの指紋が得られます。

このようにして生成された指紋は、オリジナルの公開鍵を検証するために利用されます。例えば、一般的なRSA公開鍵の長さは2048ビット以上ですが、指紋はより短いビット数で済みます。指紋を表示する際には、通常16進数の文字列にエンコードされ、視認性を高めるために文字のグループに分割されます。

例:SSH用の128ビットMD5指紋の表示

`43:51:43:a1:b5:fc:8b:b7:0a:3a:a9:b1:0f:66:73:a8`

鍵認証における指紋の活用



インターネットなどの信頼できない媒体を通じて公開鍵を入手した場合、その公開鍵が本物であることを確認する必要があります。指紋は短いバイト列であるため、長い公開鍵を伝達することが困難な状況でも、信頼できる手段を通じて容易に伝達できます。これにより、公開鍵の検証が容易になります。

例えば、アリスがボブの公開鍵を検証したい場合、アリスはボブに電話で指紋を読み上げてもらうか、紙に書かれた指紋を直接受け取ります。アリスは、入手した公開鍵から計算した指紋が、ボブから直接受け取った信頼できる指紋と一致するかどうかを確認します。このように、交換・比較する値が短い指紋であることで、鍵の検証が容易になります。

また、指紋は鍵認証データの交換や保存を自動化する際にも役立ちます。例えば、公開鍵のサイズが問題となる場合、プロトコルを介した鍵認証データの送信やデータベースへの格納には、指紋の交換や保存が現実的な解決策となることがあります。

さらに、指紋は検索エンジンで照会することにより、ダウンロードした公開鍵が改ざんされていないかを検証することができます。検索エンジンが適切なサイトにリンクされた指紋を示すことで、中間者攻撃などによる改竄の可能性を排除できます。

PGPでは、音声による指紋の交換を容易にするために、PGP単語リストが開発されています。

指紋の具体的な利用例



SSH: SSHなどのシステムでは、ユーザーが指紋を手動で交換・確認することで鍵認証を行います。指紋が承認されると、その指紋や公開鍵がローカルに保存され、以後の通信では自動的に認証されるようになります。
X.509: X.509ベースの公開鍵基盤では、指紋は主にルート鍵の認証に使用されます。これらのルート鍵は、ユーザー鍵を認証するための証明書を発行します。証明書を利用することで、ユーザー間で指紋を検証する手間を省くことができます。
PGP/Groove: PGPやGrooveなどのシステムでは、指紋は他のユーザーや認証局の鍵の認証に利用されます。PGPでは、ユーザーが互いに公開鍵に署名し合うことでWeb of trustを形成しますが、指紋はこの作業を円滑にするために使用されます(キーサインパーティーなど)。
CGA/SFS: CGAやSFS、および多くの暗号化P2Pネットワークでは、指紋は既存のアドレスや名前の形式(IPv6アドレス、ファイル名など)に組み込まれます。これらのアドレスや名前が信頼できる手段で交換されている場合、指紋を同時に交換することができます。
PGPにおける鍵ID: PGPでは、多くの鍵が「鍵ID」と呼ばれるものを持ち、これは指紋の下位32ビットまたは64ビットに相当します。鍵IDは公開鍵を参照するために使用されますが、指紋とは異なり短いため、公開鍵の安全な認証には不向きです。現在のハードウェアでは32ビットの鍵IDを短時間で生成できるため、使用は推奨されません。

指紋のセキュリティ



指紋のセキュリティにおける主な脅威は、攻撃者が被害者の公開鍵と指紋が一致する鍵ペアを作成する原像攻撃です。攻撃者は、被害者に成りすまして自身の公開鍵を提示する可能性があります。

また、一部のシステムでは、攻撃者が自身の指紋と一致する複数の鍵ペアを作成する衝突攻撃も脅威となります。これにより、署名の否認やその他の混乱を引き起こす可能性があります。

原像攻撃を防ぐためには、指紋に使用される暗号学的ハッシュ関数は第二原像攻撃耐性を持つ必要があり、衝突攻撃を防ぐためには衝突耐性も持つ必要があります。指紋の短縮化のためにハッシュ関数の出力を切り捨てることは許容されますが、その場合でも、力ずく探索攻撃に対して十分な強度を保つ必要があります。

現在広く使用されている指紋は、切り捨てられていないSHA-1MD5に基づいたものです。2019年の時点では、SHA-1MD5の強衝突耐性は突破されていますが、原像攻撃耐性はまだ存在します。将来的にはSHA-2やSHA-3が利用されるようになると考えられます。ただし、これらのハッシュ関数は出力が長いため、指紋としては切り捨てられる可能性が高くなります。

指紋の長さを最小限に抑える必要がある状況では、指紋の計算コストを増やすことでセキュリティを向上させることができます。例えば、CGAでは「ハッシュ拡張」と呼ばれる手法が用いられ、誰でも指紋を計算して0から始まるハッシュサムを検索する必要があります。これは計算コストの高い操作と見なされています。


関連項目



公開鍵暗号
* X.509

もう一度検索

【記事の利用について】

タイトルと記事文章は、記事のあるページにリンクを張っていただければ、無料で利用できます。
※画像は、利用できませんのでご注意ください。

【リンクついて】

リンクフリーです。