英文原文:https://www.nervos.org/knowledge-base/what_is_a_hash_function

ハッシュ関数とは何ですか?

ハッシュ関数は、任意の長さの入力を受け取り、それを固定長の文字列に変換する数学関数です。これらは暗号化における主要な暗号化ツールであり、メッセージング、銀行アプリケーション、暗号通貨など、多くの日常的なデジタル システムで使用されています。

ハッシュ関数を理解するための鍵は、ハッシュ関数が一方向関数であるということです。つまり、ハッシュ関数の入力は出力と逆に解析することができず、非常にシンプルでありながら信頼性の高い暗号化ツールとなっています。

例えば:

上の例に示すように、ハッシュ関数を通じて「ブロックチェーンを学びましょう」入力を実行すると、次の出力が得られます。

77db72b12a7667ad73fd33544d1f397268dffe18ca3042e0a09af9f993a8f9c1

ただし、入力にドットを追加し、ハッシュ関数で再実行すると、出力が完全に変わります。

17368fcb5bab73c97aa60aa7ae9e54e6676d292743587b9a35ace927a626520a

例は、暗号化メカニズムとしてのハッシュ関数の威力を示す最良の方法です。入力のほんのわずかな変更でも出力が完全に変わる可能性があります。つまり、出力を分析するだけで元の入力を逆解析して理解することは(ほぼ)不可能です。

ハッシュ関数が役立つのはなぜですか?

ハッシュ関数は、ビットコインとプルーフ・オブ・ワーク・マイニングにおいて重要な役割を果たします。各ブロックには、ブロックの内容に基づいた一意で変更不可能なハッシュ値が含まれていることを確認することで、ブロックチェーンの整合性が保証されます。

ビットコインマイニングでは、マイナーはネットワークによって設定された目標よりも小さいハッシュ値を見つけるために競争します。これは、ブロック ヘッダーのデータをナンス (乱数) と組み合わせ、結果のデータをハッシュ関数 (SHA-256) で実行することによって行われます。このハッシュ関数の出力は、ブロックの内容に固有の数字と文字を含む固定長の文字列です。マイナーは、ターゲット値よりも小さいハッシュ値を持つナンスを見つけるまで、多くの異なるノンスを試す必要があります。マイナーは適切なハッシュを見つけると、それを作業の証拠としてネットワークにブロードキャストし、新たに鋳造されたビットコインを報酬として受け取ります。

ハッシュ関数は、ブロックチェーン内でブロックをリンクするためにも使用されます。各ブロックには以前のブロックチェーン ヘッダー データのハッシュが含まれており、改ざん防止の方法でリンクされたブロックチェーンのチェーンが作成されます。ブロック内のデータを変更しようとすると、異なるハッシュ値が生成され、ネットワークによって検出され、無効とみなされます。

一般に、ハッシュ関数は、ビットコイン ネットワークとプルーフ オブ ワーク マイニングのセキュリティと完全性にとって重要です。これらにより、各ブロックに一意で不変のデータが含まれることが保証され、ブロックチェーンの基礎を形成する改ざん防止ブロックチェーンの作成が可能になります。

最も一般的なハッシュ アルゴリズムは何ですか?

現在、個人や企業によって使用されているハッシュ アルゴリズムには、それぞれ独自の特性を持つさまざまな種類がありますが、最も人気のあるものには、メッセージ ダイジェスト 5 (MD5)、セキュア ハッシュ アルゴリズム 1 (SHA-1)、セキュア ハッシュ ハッシュ アルゴリズム 2 (SHA) があります。 -2) およびセキュア ハッシュ アルゴリズム 3 (SHA-3)。

メッセージダイジェスト5 (MD5)

メッセージ ダイジェスト 5 (MD5) は、入力メッセージのサイズに関係なく、128 ビットの固定サイズの出力を生成する暗号化ハッシュ関数です。 1991 年に Ronald Rivest によって開発され、デジタル署名アプリケーションやファイルの整合性を検証するために広く使用されています。

MD5 は、任意の長さの入力メッセージを受け入れ、それらを固定のチャンクに分割します。次に、各ブロックは一連のラウンドを通じて処理され、それぞれのラウンドで異なる数学関数を使用して入力ブロックを変換します。各ラウンドで、MD5 は入力ブロックに対して 4 つの基本演算 (加算、ビットごとの論理演算、循環シフト、モジュラー加算) を実行します。これらの操作は、不可逆的な方法で入力ブロックをスクランブルし、入力メッセージに固有の固定サイズの出力を生成するように設計されています。

MD5 は比較的高速で効率的なハッシュ関数であると考えられていますが、攻撃に対して脆弱になる弱点もいくつかあります。たとえば、同じ MD5 出力を生成する異なる入力メッセージ (「衝突」と呼ばれる) を作成することが可能です。これにより、攻撃者が正規のファイルと同じ整合性を持つように見える悪意のあるファイルを作成することが容易になります。脆弱性のため、MD5 は強力な暗号化セキュリティを必要とする新しいアプリケーションには推奨されなくなりました。代わりに、SHA-256 や SHA-3 などのより安全なハッシュ関数を使用することをお勧めします。

セキュアハッシュアルゴリズム1 (SHA-1)

Secure Hash Algorithm 1 (SHA-1) は、ランダムな長さの入力を受け取り、メッセージ ダイジェストと呼ばれる 160 ビット (20 バイト) のハッシュ値を生成するハッシュ関数です。通常は 40 桁の 16 進数で表されます。 NSA は 1995 年にアルゴリズムを設計しましたが、それ以来、ハッシュ関数は破られ、より安全なプロトコルに置き換えられました。

SHA-1 は、入力をサイズが 448 ビットの「n」個の部分に分割し、さらに 64 ビットのパディングを加えて合計 512 ビットにすることでユーザー データを変換します。これらの 512 ビットは圧縮関数を通じて送信され、最終的な 160 ビットのハッシュ値が出力されます。

セキュアハッシュアルゴリズム (SHA-2)

セキュア ハッシュ アルゴリズム (SHA-2) は、SHA-224、SHA-256、SHA-384、および SHA-512 を含む暗号化ハッシュ関数のファミリーです。 SHA-1 と同様、SHA-2 は米国国家安全保障局 (NSA) によって設計され、さまざまなセキュリティ プロトコルおよびアプリケーションで使用されています。

SHA-2 は SHA-1 と同じ基本構造を使用しますが、入力および出力ブロック サイズが長いため、ブルート フォース攻撃に対する安全性が高くなります。 SHA-224 と SHA-256 は 32 ビット バイトを持ち、SHA-384 と SHA-512 は 64 ビット バイトを持ちます。

SHA-2 は、受信メッセージを固定サイズのチャンクに分割し、一連の数学的演算を使用して各チャンクを処理することによって機能します。各ブロックの処理には、AND、OR、XOR などの一連の論理関数のほか、モジュラー加算やビット回転演算が含まれます。

SHA-2 アルゴリズムの中心となるのは、メッセージのチャンクとメッセージ スケジュールと呼ばれる変数セットを取得し、変数を更新して新しいハッシュ値を生成する圧縮関数です。この圧縮関数は、すべてのメッセージ チャンクが処理されるまで繰り返され、その時点で最終的なハッシュ値が生成されます。

SHA-2 は、安全で強力な暗号化ハッシュ関数として広く認識されており、ブロックチェーンのデジタル署名 (SHA-256)、SSL/TLS、ファイル整合性チェックなどのさまざまなアプリケーションで使用されています。しかし、多くのセキュリティ研究者は、遅かれ早かれ、世界はより優れたセキュリティを確保するために SHA-256 から SHA-512 に移行するだろうと信じています。

セキュアハッシュアルゴリズム3 (SHA-3)

Secure Hash Algorithm 3 (SHA-3) は、米国国立標準技術研究所 (NIST) によって 2015 年にリリースされた、暗号化ハッシュ関数 Secure Hash Algorithm ファミリの最新バージョンです。これは、SHA-2 に代わる新しいハッシュ標準を開発するための公開コンペから選ばれた Keccak アルゴリズムと呼ばれる新しい設計に基づいています。

前任者と同様に、SHA-3 は任意の長さの入力メッセージを受け入れ、224、256、384、または 512 ビットの固定長の出力またはハッシュを生成します。 SHA-3 はスポンジ構造を使用します。これは、入力メッセージがアルゴリズムの状態に吸収され、その状態が圧縮されて出力ハッシュが生成されることを意味します。

スポンジ構造は、入力ビットから出力ビットへの全単射マッピングである順列関数に基づいています。置換関数は、メッセージ全体が吸収されるまで、入力メッセージとともに状態に繰り返し適用されます。次に、残りの状態が圧縮されて出力ハッシュが生成されます。

SHA-3 の SHA-2 に対する主な利点の 1 つは、攻撃者が元の入力を知らずにハッシュに追加データを追加できる長さ拡張攻撃に耐性があることです。また、SHA-3 は SHA-2 よりも設計がシンプルであるため、ハードウェアとソフトウェアへの実装が容易です。

全体として、SHA-3 は安全で効率的な暗号化ハッシュ関数と考えられており、デジタル署名、キー導出、データ整合性などのアプリケーションに推奨されます。このため、keccak-256 と呼ばれる SHA-3 ファミリの一般的なハッシュ関数が、現在、イーサリアムを含むいくつかの確立されたブロックチェーンで使用されています。 Nervos のレイヤー 1 ブロックチェーンである Common Knowledge Base (CKB) は、Eaglesong と呼ばれる SHA-3 にインスピレーションを受けた新しいハッシュ アルゴリズムを使用しています。

ハッシュ関数に関連する潜在的な脆弱性

ハッシュ関数は一般に安全であり、暗号化で広く使用されていますが、絶対確実というわけではありません。つまり、それらに関連する潜在的な脆弱性には次のものがあります。

  • 衝突攻撃: このタイプの攻撃は、攻撃者が同じハッシュ出力を生成する 2 つの入力を生成できる場合に発生します。これにより、攻撃者が入力を別の入力に置き換えることが可能になり、セキュリティ上の脆弱性が発生する可能性があります。

  • 長さ拡張攻撃: このタイプの攻撃では、攻撃者は元のメッセージの内容を知らなくても、メッセージの末尾に追加データを追加できます。これにより、攻撃者が有効なハッシュを使用して偽のメッセージを作成し、そのメッセージが正当なものであるかのように見せる可能性があります。

  • プレイメージ攻撃: プレイメージ攻撃は、攻撃者が特定のハッシュ出力を生成する入力を見つけたときに発生します。これにより、攻撃者が既知の値にハッシュするメッセージを作成することが可能になり、セキュリティ上の脆弱性につながる可能性があります。

  • 誕生日攻撃: 誕生日攻撃では、攻撃者は誕生日のパラドックスを利用して、同じハッシュ値を持つ 2 つのメッセージを見つけます。このタイプの攻撃は、MD5 などの出力サイズが小さいハッシュ関数に対して特に効果的です。

  • サイドチャネル攻撃: これらの攻撃は、ハッシュ関数を直接標的にするのではなく、ハッシュ関数が使用される実装または環境の弱点を悪用します。サイドチャネル攻撃には、タイミング、電力分析、または電磁攻撃が含まれます。

これらの脆弱性の多くは、MD5 や SHA-1 などの古いハッシュ関数または弱いハッシュ関数に関連していることに注意してください。 SHA-256 や SHA-3 などの最新のハッシュ関数は、これらの攻撃ベクトルを念頭に置いて設計されており、一般に解読不可能であると考えられています。