ハッシュとは?
ホーム
記事
ハッシュとは?

ハッシュとは?

上級者
公開済 Jul 29, 2019更新済 Jan 31, 2023
7m
ハッシュとは変数の入力からサイズが固定された出力を発行するプロセスのことを指します。 これはハッシュ関数として知られる、数式を使うことで実施されます。(ハッシュアルゴリズムとして実装) 
全てのハッシュ関数に暗号学が含まれているわけではないですが、いわゆる暗号学的ハッシュ関数は仮想通貨の核となるものです。 それらのおかげで、ブロックチェーンとその他の分散型システムはデータ統合性とセキュリティを高度なレベルで実現できています。

従来のハッシュ関数と暗号化ハッシュ関数はどちらも決定論的です。 決定論的とは、入力が変更されない限りは、ハッシュアルゴリズムは常に同じ出力(ダイジェストやハッシュともいわれます。)を生み出します。

たいてい、仮想通貨のハッシュアルゴリズムは片道だけの機能として設計されており、つまり大量の計算時間とリソースなしでは簡単に元に戻すことはできません。 言い換えると、入力から出力を作ることはとても簡単ですが、逆方向を行うのは相対的に難しくなっています。(つまり、出力だけから入力を復元することです。) 一般的に、入力を見つけるのが難しくなればなるほど、ハッシュアルゴリズムはより安全と考えられます。


ハッシュ関数の機能

違うハッシュ関数は違うサイズの出力を生み出しますが、それぞれのハッシュ関数の出力のサイズは常に同一となります。 例えば、SHA-256アルゴリズムは256ビットの出力しか作ることができないですが、SHA-1は常に160ビットのダイジェストを発行します。

ということで、ハッシュ関数の機能を理解してもらいやすくするために、Binanceとbinanceの2つの単語をビットコイン(Bitcoin)でも使われている、SHA-256ハッシュアルゴリズムにかけてみましょう。

SHA-256

入力

出力(256ビット)

Binance

f1624fcc63b615ac0e95daf9ab78434ec2e8ffe402144dc631b055f711225191

binance

59bba357145ca539dcd1ac957abc1ec5833319ddcae7f5e8b5da0c36624784b2


ここで注目していただきたいのは、最初の文字を変更するという小さな変更が、まったく違うハッシュ値という結果になっていることです。 しかし、今回はSHA-256を使っているため、出力は入力のサイズに関わらず、必ず256ビット(もしくは、64文字)の固定されたサイズとなります。 また、この2つの単語に対して、何回ハッシュアルゴリズムを実行したかに関係なく、この2つの出力は常に一定となります。

逆に、SHA-1ハッシュアルゴリズムを介して同じ入力を実行すると、以下の出力が得られます。

SHA-1

入力

出力(160ビット)

Binance

7f0dc9146570c608ac9d6e0d11f8d409a1ee6ed1

binance

e58605c14a76ff98679322cca0eae7b3c4e08936


SHAはセキュアハッシュアルゴリズム(Secure Hash Algorithms)の頭文字を取ったものです。 SHAはSHA-0、SHA-1アルゴリズムと一緒にSHA-2、SHA-3グループを含む暗号ハッシュ関数のセットを指します。 SHA-256はSHA-2グループに属していて、他の種類としてはSHA-256などがあります。 現在、SHA-2とSHA-3グループのみが安全と考えられています。


なぜ重要か?

従来のハッシュ関数にはデータベースロックアップ、大規模なファイル分析、そしてデータ管理などを含む、幅広いユースケースがあります。 一方で、暗号学的ハッシュ関数はメッセージ認証やデジタルフィンガープリントのような情報セキュリティアプリケーションにおいて、広範囲に使われています。 ビットコイン(Bitcoin)においては、暗号学ハッシュ関数はマイニングプロセスの不可欠な部分であり、新しいアドレスと鍵の発行においても重要な役割を果たしています。

ハッシュ関数の本当の実力は膨大な量の情報を処理する時に発揮されます。 例えば、大容量のファイルやデータセットをハッシュ関数を使うことで、その出力からデータの正確性や整合性を素早く検証することができます。 これは入力は常にシンプル化され、凝縮されたハッシュ値という出力になるという、ハッシュ関数の決定論的性質によって可能となっています。 このような技術によって、大容量のデータを保存し、記憶しておく必要性がなくなりました。

ハッシュはブロックチェーンテクノロジーにおいては特に便利です。 ビットコイン(Bitcoin)ブロックチェーンにはハッシュを含んでいるオペレーションが複数あり、その多くはマイニングプロセスにあります。 実際、ほぼ全ての仮想通貨プロトコルはトランザクションのグループをつなげ、凝縮したり、それぞれのブロック間に暗号学的な関連性を作って、効率的にブロックチェーンを作ったりするためにハッシュを使っています。


暗号学的ハッシュ関数

再びとはなりますが、暗号学的技術をデプロイするハッシュ関数は暗号学的ハッシュ関数として定義されるでしょう。 一般的に、暗号学的ハッシュ関数を破るには、無限とも思われる総当たり攻撃を必要とします。 暗号学的ハッシュ関数の出力から入力を導き出そうとする人は、一致する出力が発行されるまで何度もトライアンドエラーを繰り返す必要があります。 しかしながら、違う入力によって全く同じ出力が生まれる可能性もあり、これを衝突(Collision)と呼びます。

技術的に、暗号学的ハッシュ関数は安全と判断されるには3つの特徴を備えている必要があります。 この3つをここでは、衝突(Collision)耐性、原像計算困難性、そして第二原像計算困難性と呼びます。

それぞれの特徴について説明する前に、これらのロジックについて簡単にまとめておきました。

  • 衝突(Collision)耐性 偶然同じハッシュ値が出力として発行される、まったく違う入力を発見することができないことです。

  • 原像計算困難性 与えられた出力からハッシュ関数を遡って、入力を特定することができないことです。

  • 第二原像計算困難性 特定のある入力と衝突する2つ目の入力を見つけることができないことです。


衝突(Collision)耐性

前述のとおり、衝突は違う入力からまったく同じハッシュが発行されることを言います。 そのため、ハッシュ関数は誰かが衝突を発見するまでは衝突(Collision)耐性があると考えられます。 ただし、どんなハッシュ関数でも衝突は発生します。なぜなら、入力できる値は無限にも関わらず、出力は有限だからです。

言い換えると、衝突する入力を見つけるのに何百万年もの計算が必要になるぐらい発生する可能性が低い場合にハッシュ関数には衝突(Collision)耐性があると言います。 そのため、衝突が発生しないハッシュ関数は存在しないですが、SHA-256のように、いくつかのハッシュ関数は耐性があると言うのに十分なほど可能性は低くなっています。

様々なSHAアルゴリズムの中で、SHA-0とSHA-1グループは衝突が発見されたので、もはや安全とは思われていません。 現在、SHA-2とSHA-3グループは衝突への耐性があると考えられています。


原像計算困難性

原像計算困難性の特徴は一方通行というハッシュ関数のコンセプトに関連しています。 ハッシュ関数は、特定の出力を発行する入力を見つけることができる可能性が低い場合、原像計算困難性が実現できていると考えます。

この特徴は、攻撃者が与えられた出力から入力を推測しようとするため、前に説明した衝突(Collision)耐性とは違います。 一方、衝突は誰かが同じ出力を生成する2つの異なる入力を見つけたときに発生し、その出力を発行するのにどちらの入力が使用されたかは関係ありません。

メッセージの単純なハッシュは、情報を開示する必要なく、その真正性を証明できるため、原像計算困難性はデータを保護するのに役立ちます。 実務では、多くのサービスプロバイダー、アプリケーションが、パスワードの平文ではなく、パスワードから発行したハッシュ値を使用、保存しています。


第二原像計算困難性

単純化すると、第二原像計算困難性とは、これまで紹介してきた特徴の中間のようなものとも言えます。 誰かが既に知っている別の入力と同じ出力を生成する特定の入力を見つけることができる場合、第二原像攻撃が発生します。

言い換えると、第二原像攻撃は衝突を発見することが含まれますが、同じハッシュ値を生成する2つのランダムな入力を探す代わりに、この攻撃では他のある入力によって発行されたハッシュ値と同じハッシュ値を発行する別の入力を探します。

そのため、衝突(Collision)耐性のあるすべてのハッシュ関数は、第二原像計算困難性を備えています。 ただし、単一の出力から単一の入力を見つけることを意味するため、衝突耐性を持つ関数に対して、原像攻撃を実行できます。


マイニング

ビットコイン(Bitcoin)のマイニング には、残高の確認、トランザクションインプットとアウトプットの紐づけ、そしてマークルツリー生成するためにブロック内のトランザクションをハッシュすることなど、その多くのステップにハッシュ関数が使われています。 しかし、ビットコイン(Bitcoin)ブロックチェーンが安全な理由の1つは次のブロックのための有効な解答を探すためにマイナーが無数のハッシュ操作を行う必要があるからです。
特に、候補ブロックのハッシュ値を生み出すために複数の違う入力を試す必要があります。 実質的に、特定の数のゼロ(0)で始まる出力ハッシュを生成する場合にのみ、ブロックをバリデートできます。 ゼロ(0)の数がマイニングの難易度を決定し、この難易度はネットワークに使われているハッシュレートに基づいて、変動します。

この場合、ハッシュレートはどれだけの計算力がビットコイン(Bitcoin)のマイニングに投資されているかを示します。 もしも、ネットワークのハッシュレートが上昇したら、ビットコイン(Bitcoin)プロトコルは自動でマイニングの難易度を調整し、ブロックを発行するために必要な時間を10分に近づくようにします。 対照的に、マイナーの一部がマイニングを停止し、ハッシュレートが大幅に低下すると、マイニングの難易度が調整され、平均ブロック発行間隔が10分になるように、マイニングが易化されます。

有効な出力として生成できる(特定の数のゼロで始まる)複数のハッシュがあるため、マイナーは衝突を見つける必要はないです。 そのため、1つのブロックに対して、マイニングの難易度に従って決定されるしきい値を満たす解は複数あり、マイナーはそのうちの1個を見つけるだけでいいです。

ビットコイン(Bitcoin)のマイニングは莫大なコストのかかるタスクのため、マイナーは重大な金銭的損失を避けるためにも、このシステムにおいて不正を行う理由がないです。 ブロックチェーンに参加するマイナーが増えれば増えるほど、コストはより大きくなり、誠実にバリデーションを行うインセンティブはどんどん強くなります。


まとめ

コンピュータサイエンス、特に大容量のデータを処理する時に、ハッシュ関数が必要不可欠なツールであることには疑いはありません。 暗号学と組み合わせた時、ハッシュアルゴリズムの用途は非常に増え、様々な方法でセキュリティと認証を提供できます。 そのため、暗号学的ハッシュ関数はほぼすべての仮想通貨ネットワークに不可欠であるため、ブロックチェーンテクノロジーに興味がある人にとっては、その特徴と動作メカニズムを理解することは確実に役立ちます。