1. 序章

ハッシュと暗号化は、コンピューターシステムの2つの最も重要で基本的な操作です。 これらの手法は両方とも、生データを別の形式に変更します。 入力テキストのハッシュはハッシュ値を提供しますが、暗号化はデータを暗号文に変換します。

これらの手法はどちらもデータを別の形式に変換しますが、変換メカニズムと使用領域には微妙な違いがあります。

このチュートリアルでは、これらの手法とその違いについて説明します。

2. ハッシュとは何ですか?

ハッシュは、ハッシュ関数を使用して、任意のサイズのデータを固定長の値にマッピングするプロセスです。 この固定長の値は、ハッシュ値、ハッシュコード、ダイジェスト、チェックサム、または単にハッシュと呼ばれます。 コンピュータシステムは、2つの主要な領域でハッシュを使用します。

  • ネットワーク経由の転送中にファイルまたはメッセージの整合性を計算する。 たとえば、ユーザーAはユーザーBにファイルを送信し、元のメッセージとともにハッシュ値を提供できます。 ユーザーBは、受信したファイルのハッシュ値を計算できます。 両方のハッシュ値が一致すると、ユーザーBはファイルの整合性が損なわれないことを保証します
  • ハッシュのもう1つの使用法は、ハッシュテーブルです。 ハッシュテーブルは、関連付けられたハッシュ値をテーブルインデックスとして、元のデータを値として格納するデータ構造です。

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

ハッシュ関数は、提供されたデータのハッシュ値を計算する基礎となるアルゴリズムです。 ハッシュ関数の興味深い機能の1つは、それが一方向アルゴリズムであるということです。 与えられたデータからハッシュ値を計算することはできますが、逆の操作はできません。 したがって、ハッシュ値を取得して、そこからメッセージを再構築することはできません。

2.2. 優れたハッシュ関数の要件は?

使用可能なハッシュ関数を調べる前に、優れたハッシュ関数の特性を調べてみましょう。

  • 決定論的:ハッシュ関数は本質的に決定論的でなければなりません。 これは、特定の入力に対して、ハッシュ関数が同じハッシュ値を生成する必要があることを意味します
  • 入力の使用法:ハッシュ関数もほとんどの入力データを使用する必要があります。 これにより、同様の入力に対して個別のハッシュ値を生成できるようになります
  • 一様分布:ハッシュテーブルは、データを格納するためのテーブルインデックスとしてハッシュ値を使用します。 したがって、優れたハッシュ関数は、ハッシュ値がテーブル全体に均一に分散されるようにする必要があります
  • Distinct Has:ハッシュ関数は、類似した文字列に対して異なるハッシュ値を生成する必要があります

2.3. ハッシュ関数の例

除算法、アイデンティティハッシュ関数、乗算法など、ハッシュ値を計算するために使用できるそのようなアルゴリズムがいくつかあります。

2つの一般的なハッシュアルゴリズムである除算ハッシュとアイデンティティハッシュ関数を調べてみましょう。

Division Hashingアルゴリズムでは、キーの残りをテーブルサイズで割って、キーをハッシュテーブルのスロットの1つにマップします。 数学表記では、これはとして表されます。 mの値は、一意のハッシュ値を生成できるようにするためのプライマー番号です。 テーブルサイズは通常2の累乗として選択され、からへの分布を提供します。

これは単純なアルゴリズムですが、2つの大きな欠点があります。

  • 最新のコンピュータシステムは、乗算を使用して除算演算を実装しています。 したがって、除算は比較的遅い操作です
  • 特定のキーセットの場合、このアルゴリズムは同じハッシュ値を生成します。 たとえば、キー134000について考えてみます。 156000、およびmod1000の場合は145000。 3つのキーすべてが同じハッシュ値を生成するため、テーブル内の同じスロットにマップされます

IDハッシュ関数では、データ自体がハッシュ値です。このアルゴリズムは、小さいデータセットに適しています。 このコンテキストでのsmallの意味は、ハッシュ値として使用する必要のあるデータのサイズによって異なります。 たとえば、Javaでは、ハッシュコードは32ビット整数です。 したがって、32ビットIntegerおよび32ビットFloatオブジェクトは値を直接使用できます。 ただし、64ビットLongおよび64ビットDoubleオブジェクトはこのアルゴリズムを使用できません。

このアルゴリズムには2つの利点があります。

  • 値自体がハッシュ値であり、計算がないため、ハッシュ値の計算コストは事実上ゼロです。
  • ハッシュ値に衝突がないため、これは完璧なハッシュ関数です。

2.4. 衝突

ハッシュ関数を使用してハッシュ値を計算する一方で、衝突にも対処する必要があります。 ハッシュ関数が2つの異なる入力データに対して同じハッシュ値を返すと、衝突が発生します。 優れたハッシュ関数により、衝突が少なくなります。 衝突に対処するためのいくつかのテクニックがあります。

  • オープンハッシュ:この手法では、データはハッシュテーブルのハッシュキーインデックスに直接格納されません。 リンクリストなどの個別のデータ構造にデータが格納されます。 したがって、2つの別々の入力データがハッシュテーブルの同じハッシュインデックスにマップされる場合、リンクリストは入力値を線形に格納します。
  • クローズドハッシュ:この代替手法では、衝突を管理するために追加のデータ構造は使用されません。 衝突が発生した場合、空のセルが使用可能になるまで、同じハッシュテーブルで代替バケットを見つけようとします。

3. 暗号化

データ暗号化は、データを元の形式から別の形式に変換するプロセスです。 元の形式のデータはプレーンテキストと呼ばれ、暗号化された形式のデータは暗号文と呼ばれます。 暗号文は秘密鍵によって復号化されます。

3.1. データ暗号化の必要性

データを暗号化する主な目的は、データがコンピュータシステムに保存されている間、またはネットワークを介して他のコンピュータに送信されている間、データの機密性を保護することです。 最新のデータ暗号化アルゴリズムは、データの機密性を確保し、認証、整合性、否認防止などの主要なセキュリティ機能を提供します。

認証機能を使用すると、メッセージの発信元を確認できます。 整合性機能は、メッセージが送信されてからメッセージの内容が変更されていないことを保証します。 さらに、否認防止は、メッセージ送信者がメッセージの送信を拒否できないことを保証します。

3.2. データ暗号化はどのように機能しますか?

データ暗号化プロセスでは、関連データが暗号化アルゴリズムと暗号化キーで暗号化されます。 このプロセスにより暗号文が生成され、正しいキーで復号化された場合にのみ元の形式で表示できます。 キーの種類に基づいて、暗号化には主に2つの種類があります。対称暗号化と非対称暗号化です。

3.3. 対称暗号化

対称鍵暗号化は、データの暗号化と復号化に同じ秘密鍵を使用します。 このタイプの主な利点は、非対称暗号化タイプよりもはるかに高速であることです。 ただし、デメリットは、受信者が暗号化キーを復号化できるように、送信者が受信者と暗号化キーを交換する必要があることです。

秘密鍵を安全に交換するという追加のオーバーヘッドを克服するために、組織は、非対称アルゴリズムを使用してデータを暗号化した後、非対称アルゴリズムを使用して秘密鍵を交換するようになっています。

3.4. 非対称暗号化:

この暗号化タイプは、公開鍵暗号化とも呼ばれます。 これは、この暗号化プロセスで1つの公開鍵と1つの秘密鍵の2つの異なる鍵が使用されるためです。 名前が付けられている公開鍵はすべての人と共有できますが、秘密鍵は保護する必要があります。

Riverst-Sharmir-Adleman (RSA)アルゴリズムは、機密データを保護するために広く使用されている一般的な公開鍵暗号化です。 RSAアルゴリズムの人気は、公開鍵と秘密鍵の両方がメッセージを暗号化して、送信されたデータの機密性、整合性、信頼性、および否認不能性を保証できるという事実によるものです。

3.5. 暗号化の課題

暗号化アルゴリズムはデータを保護することを提供しますが、それでも多くの場合、いくつかの攻撃の犠牲になります。 これらの攻撃は、暗号化の根本的な約束を危うくします。 今日の暗号化に対する攻撃の主なタイプは、適切なキーが見つかるまで、ブルートフォースまたはランダムキーの試行です。

人気のある攻撃のもう1つのモードは、サイドチャネルです。 この攻撃タイプは、実際の暗号自体ではなく、暗号の実装を標的とします。 これらの攻撃は、システムの設計または実行にエラーがある場合に成功する傾向があります。

4. 結論

この記事では、コンピュータシステムのデータセキュリティの2つの主要な機能であるハッシュと暗号化について説明しました。

最初に、提供されたデータの一意のハッシュ値を計算するハッシュについて説明しました。

後で、データを暗号文に変換し、秘密鍵を使用して復元できる暗号化について説明しました。