
暗号学およびコンピュータサイエンスにおいて、ハッシュツリーまたはマークルツリーとは、すべての「リーフ」ノードにデータブロックの暗号ハッシュがラベル付けされ、リーフではないすべてのノード(ブランチ、内部ノード、またはinodeと呼ばれる)にその子ノードのラベルの暗号ハッシュがラベル付けされたツリーです。ハッシュツリーは、大規模なデータ構造の内容を効率的かつ安全に検証することを可能にします。ハッシュツリーは、ハッシュリストとハッシュチェーンを一般化したものです。
リーフノードが与えられた二分ハッシュツリーの一部であることを証明するには、ツリー内のリーフノードの数の対数に比例するハッシュの数を計算する必要がある。 [ 1 ]一方、ハッシュリストでは、ハッシュの数はリーフノードの数自体に比例する。したがって、マークルツリーは、ツリーのルートをコミットメントと見なし、リーフノードを明らかにして元のコミットメントの一部であることが証明できる、暗号コミットメントスキームの効率的な例である。[ 2 ]
ハッシュツリーの概念は、1979年に特許を取得したラルフ・マークルにちなんで名付けられました。 [ 3 ] [ 4 ]
ハッシュツリーは、コンピュータ内およびコンピュータ間で保存、処理、転送されるあらゆる種類のデータの検証に使用できます。ピアツーピアネットワーク内の他のピアから受信したデータブロックが破損または改ざんされていないことを確認するのに役立ちます。また、他のピアが嘘をついて偽のブロックを送信していないことを確認することもできます
ハッシュツリーは次の場合に使用されます。
信頼できるコンピューティングシステムではハッシュツリーを使用するという提案がなされている。[ 12 ]
ハッシュツリーはハッシュのツリーであり、リーフ(つまり、リーフノード、または「リーフ」と呼ばれることもあります)は、例えばファイルまたはファイルセット内のデータブロックのハッシュです。ツリーの上位のノードは、それぞれの子のハッシュです。例えば、上の図では、ハッシュ0はハッシュ0-0とハッシュ0-1の連結をハッシュした結果です。つまり、ハッシュ0 =ハッシュ(ハッシュ0-0 +ハッシュ0-1)であり、「+」は連結を表します
ほとんどのハッシュ ツリー実装はバイナリ (各ノードの下に 2 つの子ノード) ですが、各ノードの下にさらに多くの子ノードを使用することもできます。
通常、ハッシュにはSHA-2などの暗号ハッシュ関数が使用されます。ハッシュツリーで意図しない損傷からのみ保護する必要がある場合は、 CRCなどの安全でないチェックサムを使用できます。
ハッシュツリーの最上位にはトップハッシュ(またはルートハッシュ、マスターハッシュ)があります。P2Pネットワーク上でファイルをダウンロードする前に、ほとんどの場合、トップハッシュは信頼できるソース(例えば、友人や、ダウンロードするファイルの推奨情報を提供していることが知られているウェブサイトなど)から取得されます。トップハッシュが利用可能な場合、P2Pネットワーク内の任意のピアなど、信頼できないソースからハッシュツリーを受信することができます。次に、受信したハッシュツリーは信頼できるトップハッシュと照合され、ハッシュツリーが破損または偽造されている場合、プログラムはトップハッシュと一致するハッシュツリーを見つけるまで、別のソースからのハッシュツリーを試します。[ 13 ]
ハッシュ リストとの主な違いは、ハッシュ ツリーの 1 つのブランチを一度にダウンロードでき、ツリー全体がまだ利用できなくても各ブランチの整合性をすぐにチェックできることです。たとえば、図では、ツリーにすでにハッシュ 0-0 とハッシュ 1 が含まれている場合、データ ブロックをハッシュし、その結果をハッシュ 0-0、次にハッシュ 1 と繰り返し結合し、最後に結果をトップ ハッシュと比較することにより、データ ブロック L2 の整合性をすぐに検証できます。同様に、ツリーにすでにハッシュ1-1 とハッシュ 0が含まれている場合、データブロックL3の整合性を検証できます。これは、ファイルを非常に小さなデータ ブロックに分割して、小さなブロックが破損した場合にそれらのブロックのみを再ダウンロードすればよいようにするのが効率的であるため、利点となります。ハッシュされたファイルが大きい場合、このようなハッシュ リストまたはハッシュ チェーンはかなり大きくなります。ただし、ツリーの場合は、1 つの小さなブランチをすばやくダウンロードし、ブランチの整合性をチェックしてから、データ ブロックのダウンロードを開始できます。
マークルハッシュルートは木の深さを示さないため、攻撃者が元の文書とは異なる、同じマークルハッシュルートを持つ文書を作成する第二原像攻撃が可能になります。上記の例では、攻撃者は2つのデータブロックを含む新しい文書を作成できます。最初のブロックはハッシュ0-0 +ハッシュ0-1、2番目のブロックはハッシュ1-0 +ハッシュ1-1です。[ 14 ] [ 15 ]
証明書の透明性では、単純な修正方法が定義されています。リーフノードのハッシュを計算する際には、ハッシュデータの先頭に0x00バイトを付加し、内部ノードのハッシュを計算する際には0x01バイトを付加します。[ 13 ]ハッシュツリーのサイズを制限することは、いくつかの形式的なセキュリティ証明 の前提条件であり、証明をより厳密にするのに役立ちます。一部の実装では、ハッシュの前にハッシュツリーの深さのプレフィックスを使用してツリーの深さを制限しているため、抽出されたハッシュチェーンは、プレフィックスが各ステップで減少し、リーフに到達した時点でも正の値である場合にのみ有効であると定義されます。
タイガーツリーハッシュは、広く使われているハッシュツリーの形式です。バイナリハッシュツリー(各ノードの下に2つの子ノード)を使用し、通常1024バイトのデータブロックサイズを持ち、タイガーハッシュを使用します。[ 16 ]
Tiger木ハッシュは、Gnutella[ 17 ] 、Gnutella2、 Direct Connect P2Pファイル共有プロトコル[ 18 ]、およびPhex [ 19 ]、BearShare、LimeWire、Shareaza、DC++ [ 20 ]、gtk-gnutella [ 21 ]などのファイル共有アプリケーションで使用されています。
レプリカが長時間ダウンした場合、または利用できないレプリカのヒント付きハンドオフを保存しているマシンもダウンした場合、レプリカは互いに同期する必要があります。この場合、CassandraとRiakはDynamoに着想を得たアンチエントロピーと呼ばれるプロセスを実装しています。アンチエントロピーでは、レプリカはマークルツリーを交換して、複製されたキー範囲の同期していない部分を特定します。マークルツリーは階層的なハッシュ検証です。2つのレプリカ間でキー空間全体のハッシュが同じでない場合、同期していないキーが特定されるまで、複製されたキー空間のより小さな部分のハッシュを交換します。このアプローチにより、ほとんどが類似したデータを含むレプリカ間の不要なデータ転送が削減されます
{{cite book}}:CS1メンテナンス:場所が不明な出版社(リンク)