
ハッシュ化は、計算が速く、逆算が難しい一方向の数学演算です。[ 1 ] そのため、パスワードの保存やデジタル署名にはハッシュが役立ちます。[ 2 ] 入力にわずかな変更を加えるだけでも、ハッシュは大きく異なります。そのため、2 つのデータまたはソフトウェアのコピーが一致するかどうかを確認するのに役立ちます。[ 3 ] 通常、この操作は入力データのブロックに対して実行されます。ハッシュ出力は次のブロックとハッシュ化され、その時点までのすべてを反映した新しいハッシュが作成されます。最終的なハッシュが最後のブロックまでのすべてを反映したものになるまで、これを繰り返します。[ 2 ]
より技術的に言うと:[ 4 ]
暗号学的ハッシュ関数は、デジタル署名、メッセージ認証コード(MAC)、その他の認証形式など、多くの情報セキュリティ用途があります。また、通常のハッシュ関数として、ハッシュテーブルのデータのインデックス付け、フィンガープリンティング、重複データの検出、ファイルの一意の識別、偶発的なデータ破損を検出するためのチェックサムとしても使用できます。実際、情報セキュリティの文脈では、暗号学的ハッシュ値は、(デジタル)フィンガープリント、チェックサム、(メッセージ)ダイジェスト[ 5 ]、または単にハッシュ値と呼ばれることがありますが、これらの用語はすべて、かなり異なる特性と目的を持つより一般的な関数を表しています。[ 6 ]
非暗号的なハッシュ関数はハッシュテーブルで使用され、偶発的なエラーを検出するために使用されます。これらの関数の構造は、意図的な攻撃に対する耐性をほとんど提供しません。たとえば、線形巡回冗長検査(CRC)関数の場合のように、衝突が容易に見つかる場合、ハッシュテーブルに対するサービス拒否攻撃が可能です。[ 7 ]
ほとんどの暗号学的ハッシュ関数は、任意の長さの文字列を入力として受け取り、固定長のハッシュ値を生成するように設計されています。
暗号学的ハッシュ関数は、既知のすべての種類の暗号解読攻撃に耐えることができなければなりません。理論暗号学では、暗号学的ハッシュ関数のセキュリティレベルは、以下の特性を用いて定義されています。
衝突耐性は第2原像耐性を意味するが、原像耐性を意味するわけではない。[ 9 ]理論暗号では常に弱い仮定が好まれるが、実際には第2原像耐性しかないハッシュ関数は安全でないと考えられ、実際のアプリケーションには推奨されない。
非公式に言えば、これらの特性は、悪意のある攻撃者が入力データをダイジェストを変更せずに置き換えたり変更したりすることができないことを意味します。したがって、2つの文字列のダイジェストが同じであれば、それらが同一であると非常に確信できます。第二原像耐性は、攻撃者が制御できない文書と同じハッシュを持つ文書を作成することを攻撃者に防ぎます。衝突耐性は、攻撃者が同じハッシュを持つ2つの異なる文書を作成することを防ぎます。
これらの基準を満たす関数でも、望ましくない特性を持つ場合があります。現在、一般的な暗号学的ハッシュ関数は、長さ拡張攻撃に対して脆弱です。hash ( m )とlen( m )は与えられているがmは与えられていない場合、攻撃者は適切なm ′を選択することでhash( m∥m ′ )を計算できます。ここで∥は連結を表します。[ 10 ]この特性は、ハッシュ関数に基づく単純な認証方式を破るために使用できます。HMAC構成は、これらの問題を回避します。
実際には、衝突耐性だけでは多くの実用的な用途には不十分です。衝突耐性に加えて、攻撃者が実質的に類似したダイジェストを持つ 2 つのメッセージを見つけること、またはダイジェストのみからデータに関する有用な情報を推測することが不可能でなければなりません。特に、ハッシュ関数は、決定論的かつ効率的に計算可能であると同時に、可能な限りランダム関数(セキュリティ証明ではランダムオラクルと呼ばれることが多い) のように振る舞う必要があります。これは、理想的な格子上の特定の問題が計算上困難であると仮定すれば衝突耐性があることが厳密に証明できるSWIFFT関数のような関数を排除しますが、線形関数であるため、これらの追加特性を満たしません。[ 11 ]
CRC-32やその他の巡回冗長検査などのチェックサムアルゴリズムは、はるかに緩い要件を満たすように設計されており、一般的に暗号学的ハッシュ関数としては不向きです。例えば、 WEP暗号化規格ではメッセージの完全性を保証するためにCRCが使用されていましたが、チェックサムの線形性を悪用する攻撃が容易に発見されました。
暗号化の実践において、「困難」とは一般的に「システムのセキュリティが重要視されている限り、システムを破ることを阻止しなければならない攻撃者にとって、ほぼ確実に手の届かないレベル」を意味します。したがって、この用語の意味はアプリケーションによって多少異なります。なぜなら、悪意のある攻撃者がこの作業に費やす労力は、通常、期待される利益に比例するからです。しかし、必要な労力は通常、ダイジェストの長さに比例するため、処理能力が1000倍優れていても、ダイジェストの長さに12ビット追加するだけで、その利点は相殺されてしまいます。
限られたメッセージセットから選択されたメッセージ(例えば、パスワードやその他の短いメッセージ)の場合、セット内のすべてのメッセージを試すことでハッシュ値を逆算することが可能です。暗号学的ハッシュ関数は通常、高速に計算できるように設計されているため、このような総当たり攻撃を困難にするために、より多くの計算リソースを必要とする特別な鍵導出関数が開発されています。
理論的な分析において、 「困難」という言葉は、「漸近多項式時間では解けない」といった特定の数学的な意味を持つ場合がある。このような困難さの解釈は、証明可能な安全性を備えた暗号学的ハッシュ関数の研究において重要であるが、通常は実用的なセキュリティとは強い関連性を持たない。例えば、指数時間アルゴリズムであっても、実行可能な攻撃を行うには十分な速さである場合がある。逆に、多項式時間アルゴリズム(例えば、n桁の鍵に対してn 20ステップを必要とするもの)は、実用的な用途には遅すぎる可能性がある。
暗号学的ハッシュの潜在的な用途の例を以下に示します。アリスはボブに難しい数学の問題を出し、自分が解いたと主張します。ボブは自分で解いてみたいのですが、アリスが嘘をついていないか確認したいと思っています。そこでアリスは自分の解答を書き留め、そのハッシュ値を計算し、ボブにハッシュ値を伝えます(解答自体は秘密にしておきます)。数日後、ボブが自分で解答を思いついたとき、アリスは解答を公開し、ボブにハッシュ値を計算させて、以前自分が伝えたハッシュ値と一致するかどうかを確認させることで、自分が先に解いていたことを証明できます。(これは単純なコミットメントスキームの例です。実際には、アリスとボブはコンピュータプログラムであることが多く、秘密は主張されたパズルの解答よりも偽造されにくいものになります。)
セキュアハッシュの重要な応用例の一つは、メッセージの完全性の検証です。送信前と送信後に計算されたメッセージダイジェスト(メッセージのハッシュダイジェスト)を比較することで、メッセージやファイルに変更が加えられたかどうかを判断できます。
MD5、SHA-1、またはSHA-2ハッシュダイジェストは、ダウンロードしたファイルの整合性を検証できるように、Webサイトやフォーラムで公開されることがあります[ 12 ] 。これには、ミラーリングなどのファイル共有を使用して取得したファイルも含まれます。この方法は、ハッシュが信頼できるサイト(通常は元のサイト)に投稿され、 HTTPSで認証されている限り、信頼の連鎖を確立します。暗号化ハッシュと信頼の連鎖を使用することで、ファイルへの悪意のある変更を検出できます。巡回冗長検査などの非暗号化エラー検出コードは、意図的ななりすましによって衝突するコード値を簡単に作成できるため、ファイルの悪意のない変更を防ぐだけです。
ほぼすべてのデジタル署名方式では、メッセージに対して暗号学的ハッシュを計算する必要があります。これにより、比較的小さく、静的なサイズのハッシュダイジェストに対して署名計算を実行できます。署名とメッセージに対して再計算されたハッシュダイジェストを用いて署名検証が成功すれば、メッセージは真正であるとみなされます。このように、暗号学的ハッシュのメッセージ完全性という特性を利用して、安全かつ効率的なデジタル署名方式が構築されます。
パスワード認証は一般的に暗号化ハッシュに依存しています。すべてのユーザーパスワードを平文で保存すると、パスワードファイルが侵害された場合に大規模なセキュリティ侵害につながる可能性があります。この危険性を軽減する一つの方法は、各パスワードのハッシュダイジェストのみを保存することです。ユーザー認証では、ユーザーが入力したパスワードをハッシュ化し、保存されているハッシュと比較します。パスワードのハッシュ化を行う際には、パスワードリセット方法が必要です。保存されたハッシュ値から元のパスワードを再計算することはできません。
しかし、SHA シリーズなどの標準的な暗号学的ハッシュ関数の使用は、パスワードの保存にはもはや安全とは考えられていません。[ 13 ] : 5.1.1.2これらのアルゴリズムは高速に計算されるように設計されているため、ハッシュ値が漏洩した場合、推測されたパスワードを高速に試行することが可能です。一般的なグラフィックス処理ユニットは、毎秒数十億の可能なパスワードを試行できます。PBKDF2 、scrypt、またはArgon2などのキー ストレッチを実行するパスワード ハッシュ関数は、一般的に暗号学的ハッシュを繰り返し呼び出して、保存されたパスワード ハッシュ ダイジェストに対する総当たり攻撃を実行するのに必要な時間 (場合によってはコンピュータ メモリ) を増加させます。詳細については、§ハッシュ化されたパスワードに対する攻撃を参照してください。
パスワードハッシュでは、パスワードハッシュと共に保存できる、大きなランダムな非秘密のソルト値も必要となります。ソルトはパスワードと共にハッシュ化され、パスワードごとにパスワードハッシュのマッピングが変更されるため、攻撃者が事前に計算されたハッシュ値のテーブルを保存してパスワードハッシュダイジェストと比較したり、盗み出した多数のハッシュ値を並行してテストしたりすることは事実上不可能になります。
プルーフ・オブ・ワーク・システム(またはプロトコル、関数)は、サービス要求者に何らかの作業(通常はコンピュータによる処理時間)を要求することで、ネットワーク上でのサービス拒否攻撃やスパムなどのサービス悪用を抑止するための経済的な手段です。これらのスキームの重要な特徴は非対称性です。要求者側では適度に困難(ただし実行可能)な作業が必要ですが、サービス提供者側では簡単に検証できます。ビットコインマイニングやハッシュキャッシュで使用されている一般的なシステムでは、部分ハッシュ反転を使用して作業が行われたことを証明し、ビットコインのマイニング報酬をアンロックし、ハッシュキャッシュで電子メールを送信するための善意のトークンとして使用します。送信者は、ハッシュ値がゼロビットで始まるメッセージを見つける必要があります。有効なメッセージを見つけるために送信者が実行する必要のある平均的な作業は、ハッシュ値に必要なゼロビットの数に対して指数関数的に増加しますが、受信者は単一のハッシュ関数を実行することでメッセージの有効性を検証できます。例えば、Hashcashでは、送信者は160ビットのSHA-1ハッシュ値の最初の20ビットがゼロであるヘッダーを生成するように求められます。送信者は、平均して2¹⁹回試行して有効なヘッダーを見つける必要があります。
メッセージダイジェストは、ファイルを確実に識別する手段としても機能します。Git 、Mercurial、Monotoneなどのいくつかのソースコード管理システムは、さまざまな種類のコンテンツ(ファイルの内容、ディレクトリツリー、祖先情報など)のsha1sumを使用して、それらを一意に識別します。ハッシュは、ピアツーピアファイル共有ネットワークでファイルを識別するために使用されます。たとえば、ed2kリンクでは、MD4バリアントハッシュがファイルサイズと組み合わされ、ファイルソースの特定、ファイルのダウンロード、およびその内容の検証に十分な情報を提供します。マグネットリンクも別の例です。このようなファイルハッシュは、ハッシュリストまたはハッシュツリーの最上位ハッシュであることが多く、これにより追加のメリットが得られます。
ハッシュ関数の主な用途の一つは、ハッシュテーブル内のデータを高速に検索できるようにすることです。暗号学的ハッシュ関数は、特殊な種類のハッシュ関数であるため、この用途にも非常に適しています。
しかし、標準的なハッシュ関数と比較すると、暗号学的ハッシュ関数は計算コストがはるかに高くなる傾向があります。そのため、暗号学的ハッシュ関数は、悪意のある参加者による偽造(期待されるデータと同じダイジェストを持つデータの作成)の可能性からユーザーを保護する必要がある状況で使用される傾向があります。例えば、複数のダウンロード元を持つオープンソースアプリケーションでは、悪意のあるファイルがユーザーにとって同じように見えるように置き換えられたり、正規のファイルが悪意のあるデータを含むように変更されたりする可能性があります。[ 14 ]
コンテンツアドレス指定ストレージ(CAS)は、コンテンツアドレス指定ストレージまたは固定コンテンツストレージとも呼ばれ、名前や場所ではなく、コンテンツに基づいて情報を取得できるように情報を保存する方法です。これは、政府規制への準拠のために保存される文書など、固定コンテンツの高速な保存と取得に使用されてきました。コンテンツアドレス指定ストレージは、コンテンツアドレス指定メモリに似ています。
CASシステムは、ファイルの内容を暗号学的ハッシュ関数に通して一意のキーである「コンテンツアドレス」を生成することで機能します。ファイルシステムのディレクトリには、これらのアドレスとコンテンツの物理的な保存場所へのポインタが格納されます。同じファイルを保存しようとすると必ず同じキーが生成されるため、CASシステムは内部のファイルが一意であることを保証します。また、ファイルを変更すると新しいキーが生成されるため、CASシステムはファイルが変更されていないことを保証します。
コンテンツアドレス指定(CAS)は、2000年代に重要な市場となりました。特に、米国で2002年に施行されたサーベンス・オクスリー法では、膨大な数の文書を長期間保存し、ごくまれにしか取り出さないことが義務付けられました。従来のファイルシステムや新しいソフトウェアシステムの性能向上に伴い、従来のCASシステムの価値は低下し、2018年頃からはますます希少になっています。しかし、コンテンツアドレス指定の原理は、コンピュータ科学者にとって依然として大きな関心事であり、ピアツーピアファイル共有、暗号通貨、分散コンピューティングなど、数多くの新興技術の中核を成しています。
ブロック暗号を使用して暗号学的ハッシュ関数、特に一方向圧縮関数を構築する方法はいくつかあります。
これらの手法は、暗号化によく用いられるブロック暗号の動作モードに似ています。MD4、MD5 、 SHA - 1 、 SHA -2など、多くの有名なハッシュ関数は、ブロック暗号に似たコンポーネントから構築されており、結果として得られる関数が逆変換できないようにフィードバックが加えられています。SHA -3の最終候補には、ブロック暗号に似たコンポーネントを持つ関数(Skein、BLAKEなど)が含まれていましたが、最終的に選ばれたKeccak関数は、代わりに暗号スポンジをベースに構築されていました。
これらのカスタムブロック暗号の代わりに、AESなどの標準ブロック暗号を使用することもできます。これは、組み込みシステムが最小限のコードサイズまたはハードウェア領域で暗号化とハッシュ化の両方を実装する必要がある場合に役立つ可能性があります。ただし、このアプローチでは効率とセキュリティにコストがかかる場合があります。ハッシュ関数で使用される暗号はハッシュ化用に設計されています。つまり、大きな鍵とブロックを使用し、ブロックごとに効率的に鍵を変更でき、関連鍵攻撃に対する耐性を持つように設計および検証されています。汎用暗号は、異なる設計目標を持つ傾向があります。特に、AESは鍵とブロックのサイズが大きいため、長いハッシュ値を生成するために使用するのは容易ではありません。AES暗号化は、鍵がブロックごとに変更されると効率が低下します。また、関連鍵攻撃により、ハッシュ関数で使用する場合、暗号化で使用する場合よりもセキュリティが低下する可能性があります。

ハッシュ関数は、任意の長さのメッセージを固定長の出力に処理できなければなりません。これは、入力を同じサイズのブロックに分割し、一方向圧縮関数を使用してそれらを順番に処理することで実現できます。圧縮関数は、ハッシュ化専用に設計することも、ブロック暗号から構築することもできます。Merkle–Damgård構造で構築されたハッシュ関数は、その圧縮関数と同様に衝突耐性があります。ハッシュ関数全体で発生した衝突は、圧縮関数での衝突に起因することが確認できます。
最後に処理されるブロックも、長さが明確にパディングされている必要があります。これは、この構造のセキュリティにとって非常に重要です。この構造は、マークル・ダムガード構造と呼ばれます。SHA -1やMD5を含む、最も一般的な古典的なハッシュ関数のほとんどは、この形式をとります。
ハッシュ出力のサイズが内部状態のサイズ(各圧縮ステップ間)と等しいMerkle–Damgård構成を単純に適用すると、狭パイプハッシュ設計になります。この設計は、長さ拡張、多重衝突[ 15 ]、ロングメッセージ攻撃[ 16 ] 、生成アンドペースト攻撃など、多くの固有の欠陥を引き起こし、並列化もできません。そのため、現代のハッシュ関数は、より大きな内部状態サイズを持つ広パイプ構成に基づいて構築されており、Merkle–Damgård構成の微調整[ 15 ]から、スポンジ構成やHAIFA構成[ 17 ]などの新しい構成まで多岐にわたります。NISTハッシュ関数コンペティションの参加者はいずれも、古典的なMerkle–Damgård構成を使用していません。[ 18 ]
一方、SHA-512/256で使用されるような長いハッシュの出力を切り詰めることも、これらの攻撃の多くを無効化する。[ 19 ]
ハッシュ関数は、他の暗号プリミティブを構築するために使用できます。これらの他のプリミティブが暗号学的に安全であるためには、正しく構築するように注意する必要があります。
メッセージ認証コード(MAC)(キー付きハッシュ関数とも呼ばれる)は、多くの場合、ハッシュ関数から構築されます。HMACはそのようなMACの一つです。
ブロック暗号を使ってハッシュ関数を構築できるの と同様に、ハッシュ関数を使ってブロック暗号を構築することもできます。ハッシュ関数を用いたLuby-Rackoff構成は、基となるハッシュ関数が安全であれば、証明可能な安全性を持つことができます。また、多くのハッシュ関数(SHA-1やSHA-2など)は、 Davies-Meyer構成などの特殊なブロック暗号を用いて構築されています。このような暗号は、同じ安全性の保証なしに、従来の動作モードでも使用できます。例えば、SHACAL、BEAR、LIONなどが挙げられます。
擬似乱数発生器(PRNG)はハッシュ関数を用いて構築できます。これは、(秘密の)乱数シードとカウンターを組み合わせてハッシュ化することによって行われます。
Skein、Keccak、RadioGatúnなどのハッシュ関数は、任意の長さのストリームを出力し、ストリーム暗号として使用できます。また、ストリーム暗号は、固定長のダイジェストハッシュ関数から構築することもできます。多くの場合、これは、まず暗号学的に安全な擬似乱数生成器を構築し、次にそのランダムバイトのストリームをキーストリームとして使用することによって行われます。SEALは、 SHA-1を使用して内部テーブルを生成するストリーム暗号であり、生成されたテーブルは、ハッシュアルゴリズムとはほとんど関係のないキーストリーム生成器で使用されます。SEALは、SHA-1と同じくらい強力(または弱い)であるとは保証されていません。同様に、HC-128およびHC-256ストリーム暗号の鍵拡張では、SHA-256ハッシュ関数が多用されています。
複数のハッシュ関数の出力を連結すると、連結結果に含まれるアルゴリズムの中で最も強力なものと同等の衝突耐性が得られます。 たとえば、トランスポート層セキュリティ(TLS)とセキュアソケットレイヤー(SSL)の古いバージョンでは、連結されたMD5とSHA-1の合計が使用されていました。[ 20 ] [ 21 ]これにより、いずれかのハッシュ関数で衝突を見つける方法が、両方のハッシュ関数で保護されているデータを破らないことが保証されます。
Merkle–Damgård 構成ハッシュ関数の場合、連結関数は最も強いコンポーネントと同じ衝突耐性を持ちますが、それ以上の衝突耐性はありません。Antoine Joux は、2 衝突がn衝突につながることを指摘しました。攻撃者が 2 つの MD5 ハッシュを持つメッセージを見つけることが可能であれば、同じ MD5 ハッシュを持つ追加のメッセージを、それほど難しくなく、望むだけ見つけることができます。[ 22 ]同じ MD5 ハッシュを持つn個のメッセージの中には、SHA-1 で衝突が発生する可能性が高いです。SHA-1 衝突を見つけるために必要な追加の作業 (指数関数的な誕生日検索以外) は、多項式時間で済みます。[ 23 ] [ 24 ]
暗号学的ハッシュアルゴリズムは数多く存在しますが、このセクションでは比較的よく参照されるアルゴリズムをいくつか紹介します。より詳細なリストは、暗号学的ハッシュ関数の比較ページに掲載されています。
MD5は、1991年にロナルド・リベストによって、以前のハッシュ関数であるMD4に代わるものとして設計され、1992年にRFC 1321として仕様が定められました。MD5との衝突は数秒以内に計算できるため、暗号学的ハッシュが必要とされるほとんどの用途には適していません。MD5は128ビット(16バイト)のダイジェストを生成します。
SHA-1 は、米国政府のCapstoneプロジェクトの一環として開発されました。アルゴリズムの元の仕様 (現在では一般的に SHA-0 と呼ばれています) は、1993 年に米国政府の標準化機関である NIST (国立標準技術研究所) によって Secure Hash Standard、FIPS PUB 180 というタイトルで公開されました。これは公開後まもなく NSA によって撤回され、1995 年に FIPS PUB 180-1 で公開され、一般に SHA-1 と指定されている改訂版に置き換えられました。完全な SHA-1 アルゴリズムに対する衝突は、シャッタード攻撃 を使用して生成することができ、ハッシュ関数は破られているとみなされます。SHA-1 は 160 ビット (20 バイト) のハッシュ ダイジェストを生成します。
文書によっては、SHA-1を単に「SHA」と表記することがありますが、これはSHA-0、SHA-2、SHA-3などの他のセキュアハッシュアルゴリズムと矛盾する可能性があります。
RIPEMD (RACE Integrity Primitives Evaluation Message Digest) は、ベルギーのルーヴェンにあるルーヴェン・カトリック大学の COSIC 研究グループの Hans Dobbertin、Antoon Bosselaers、Bart Preneel によって開発され、1996 年に初めて発表された暗号ハッシュ関数のファミリーです。RIPEMD は MD4 で使用されている設計原理に基づいており、パフォーマンスはより普及している SHA-1 と似ています。ただし、RIPEMD-160 はまだ解読されていません。名前が示すように、RIPEMD-160 は 160 ビット (20 バイト) のハッシュダイジェストを生成します。
Whirlpoolは、Vincent RijmenとPaulo SLM Barretoによって設計され、2000年に初めて発表された暗号学的ハッシュ関数です。Whirlpoolは、Advanced Encryption Standard(AES)を大幅に改良したバージョンに基づいています。Whirlpoolは、512ビット(64バイト)のハッシュダイジェストを生成します。
SHA-2(Secure Hash Algorithm 2)は、米国国家安全保障局(NSA)が設計した暗号学的ハッシュ関数群であり、2001年に初めて公開されました。これらは、(機密扱いの)特殊なブロック暗号からデイビス・マイヤー構造を用いて構築された一方向圧縮関数を基に、メルクル・ダムガード構造を用いて構築されています。
SHA-2 は基本的に SHA-256 と SHA-512 の 2 つのハッシュアルゴリズムで構成されています。SHA-224 は、開始値が異なり、出力が切り捨てられる SHA-256 の変種です。SHA-384、あまり知られていない SHA-512/224、SHA-512/256 はすべて SHA-512 の変種です。SHA-512 は SHA-256 よりも安全で、AMD64などの 64 ビットマシンでは SHA-256 よりも一般的に高速です。
出力サイズ(ビット単位)は「SHA」名の拡張子によって決まります。したがって、SHA-224の出力サイズは224ビット(28バイト)、SHA-256は32バイト、SHA-384は48バイト、SHA-512は64バイトとなります。
SHA-3(Secure Hash Algorithm 3)は、2015年8月5日にNISTによって公開されました。SHA-3は、より広範な暗号プリミティブファミリーであるKeccakのサブセットです。Keccakアルゴリズムは、Guido Bertoni、Joan Daemen、Michael Peeters、およびGilles Van Asscheによって開発されました。Keccakはスポンジ構造に基づいており、ストリーム暗号などの他の暗号プリミティブの構築にも使用できます。SHA-3は、SHA-2と同じ224、256、384、および512ビットの出力サイズを提供します。
SHAKE-128関数とSHAKE-256関数を使用すると、設定可能な出力サイズを取得することもできます。ここで、関数名に付加されている-128と-256は、出力サイズ(ビット単位)ではなく、関数のセキュリティ強度を表しています。
BLAKE の改良版である BLAKE2 は、2012 年 12 月 21 日に発表されました。これは、広く使用されているものの欠陥のある MD5 および SHA-1 アルゴリズムを置き換えることを目的として、Jean-Philippe Aumasson、Samuel Neves、Zooko Wilcox-O'Hearn、および Christian Winnerlein によって作成されました。64 ビット x64 および ARM アーキテクチャで実行した場合、BLAKE2b は SHA-3、SHA-2、SHA-1、および MD5 よりも高速です。BLAKE と BLAKE2 は SHA-3 のように標準化されていませんが、BLAKE2 は最新の CPU で高い効率性を発揮するため、 Argon2パスワードハッシュを含む多くのプロトコルで使用されています。BLAKE は SHA-3 の候補であったため、BLAKE と BLAKE2 はどちらも、構成可能な出力サイズを含め、SHA-3 と同じ出力サイズを提供します。
BLAKE2の改良版であるBLAKE3は、2020年1月9日に発表されました。これは、Jack O'Connor、Jean-Philippe Aumasson、Samuel Neves、およびZooko Wilcox-O'Hearnによって作成されました。BLAKE3は単一のアルゴリズムであり、複数のバリアントを持つアルゴリズムファミリーであるBLAKEおよびBLAKE2とは対照的です。BLAKE3の圧縮関数はBLAKE2の圧縮関数に非常に近いもので、最大の違いはラウンド数が10から7に削減されている点です。内部的には、BLAKE3はマークルツリーであり、BLAKE2よりも高い並列度をサポートしています。
ハッシュアルゴリズムにはいくつかの種類があり、一般的には特定の地域や管轄区域でのみ使用されています。よく知られているものとしては、以下のようなものがあります。
暗号学的ハッシュ関数は数多く存在しますが、その多くは脆弱性が発見されており、使用すべきではありません。例えば、NISTはSHA-3ハッシュコンペティションの第1ラウンドの候補として51個のハッシュ関数[ 25 ]を選定しましたが、そのうち10個は破綻していると見なされ、16個は重大な弱点を示したため、次のラウンドに進むことができませんでした。詳細については、NISTハッシュ関数コンペティションに関するメイン記事を参照してください。
ハッシュ関数がこれまで破られたことがなくても、弱体化したバージョンに対する攻撃が成功すれば、専門家の信頼が損なわれる可能性があります。たとえば、2004 年 8 月には、MD5 を含む当時普及していたいくつかのハッシュ関数で衝突が発見されました。 [ 26 ]これらの脆弱性により、弱いハッシュ関数から派生したより強力なアルゴリズム、特に SHA-1 (SHA-0 の強化版)、RIPEMD-128、および RIPEMD-160 (いずれも RIPEMD の強化版) のセキュリティが疑問視されるようになりました。[ 27 ]
2004年8月12日、Joux、Carribault、Lemuel、およびJalbyは、完全なSHA-0アルゴリズムの衝突を発表しました。[ 22 ] Jouxらは、ChabaudとJouxの攻撃の一般化を使用してこれを実現しました。彼らは、衝突の複雑さが2 51であり、 256個のItanium 2プロセッサを搭載したスーパーコンピュータで約80,000 CPU時間かかったことを発見しました。これは、スーパーコンピュータを13日間フルに使用した場合と同じです。
2005 年 2 月、SHA-1 に対する攻撃が報告され、160 ビットのハッシュ関数で予想される2 80 回のハッシュ操作ではなく、約 2 69回のハッシュ操作で衝突が見つかることが判明しました。2005 年 8 月には、SHA-1 に対する別の攻撃が報告され、2 63 回の操作で衝突が見つかることが判明しました。SHA-1 の他の理論的な弱点も知られており、[ 28 ] [ 29 ] 2017 年 2 月には Google が SHA-1 の衝突を発表しました。[ 30 ]セキュリティ研究者は、新しいアプリケーションでは、 SHA-2などの SHA ファミリーの後継メンバーを使用するか、衝突耐性を必要としないランダム化ハッシュ[ 31 ]などの技術を使用することで、これらの問題を回避できると推奨しています。
2008年にMD5(トランスポート層セキュリティの証明書で使用されている)を破る、実用的で成功した攻撃が行われた。[ 32 ]
多くの暗号学的ハッシュは、マークル・ダムガード構造に基づいています。マークル・ダムガード構造の出力全体を直接使用するすべての暗号学的ハッシュは、長さ拡張攻撃に対して脆弱です。このため、MD5、SHA-1、RIPEMD-160、Whirlpool、およびSHA-256/SHA-512ハッシュアルゴリズムはすべて、この特定の攻撃に対して脆弱です。SHA-3、BLAKE2、BLAKE3、および切り詰められたSHA-2バリアントは、この種の攻撃に対して脆弱ではありません。
アクセス制御システムでは、平文のユーザーパスワードを保存する代わりに、各ユーザーのパスワードのハッシュ値をファイルまたはデータベースに保存することがよくあります。誰かがアクセスを要求すると、送信されたパスワードがハッシュ化され、保存されている値と比較されます。データベースが盗まれた場合(非常に頻繁に発生する事象です[ 33 ])、泥棒はパスワードではなくハッシュ値しか入手できません。
パスワードは、ほとんどの人が予測可能な方法でパスワードを選択するため、ハッシュから攻撃者によって取得される可能性があります。一般的なパスワードのリストは広く流通しており、多くのパスワードは十分に短いため、ハッシュの計算に時間がかかりすぎなければ、考えられるすべての組み合わせを試すことができます。[ 34 ]
暗号化ソルトの使用は、レインボーテーブルなどのハッシュ値を事前に計算したファイルを作成するなどの一部の攻撃を防ぎます。しかし、高性能グラフィックプロセッサを使用すれば、毎秒1000億回のテストを実行できるため、ソルトを使用しても直接攻撃が可能になります。[ 35 ] [ 36 ] 米国国立標準技術研究所( NIST)は、総当たり攻撃を遅くするために作成された鍵導出関数(KDF)と呼ばれる特殊なハッシュを使用してパスワードを保存することを推奨しています。 [ 13 ]: 5.1.1.2 遅いハッシュには、pbkdf2、bcrypt、scrypt、argon2、Balloon 、およびUnix cryptの最近のモードが含まれます。実行を遅くするために複数のハッシュを実行するKDFについては、NISTは10,000回以上の反復回数を推奨しています。[ 13 ]: 5.1.1.2
暗号化アルゴリズム以上に、一方向ハッシュ関数は現代の暗号技術の主力です。
{{cite book}}: CS1 maint: 非推奨のアーカイブサービス (リンク) (関連ウェブサイトにはハッシュ関数を扱うオンライン暗号化コースがあります){{cite web}}: CS1メンテナンス: アーカイブサービスは非推奨になりました (リンク)