TERM GUIDE · SECURITY

ハッシュ値

「ハッシュ値」とは

ハッシュ値とは、データに一定の計算を行って得られる値です。この計算に使う規則や仕組みをハッシュ関数といいます。

ハッシュ関数は、文字列、数値、画像、ファイルなど、さまざまなデータに適用できます。同じハッシュ関数を使えば、同じデータからは必ず同じハッシュ値が得られます。

ハッシュ値は、主に次のような目的で利用されます。

  • データの完全性の確認:ファイルなどの内容が変更されていないかを調べる
  • データの高速な検索:データから格納位置を計算し、目的のデータを効率よく探す
  • データの同一性の確認:複数のファイルが同じ内容かどうかを調べる
  • デジタル署名やブロックチェーン:データの改ざんを検出しやすくする

これらの用途では、ハッシュ関数に求められる性質が異なります。特に、情報セキュリティで使用するものを暗号学的ハッシュ関数といいます。

ハッシュ関数とハッシュ値の基本的な性質

ハッシュ関数には、次のような基本的な性質があります。

① 同じデータからは同じハッシュ値が得られる

ハッシュ関数による計算結果は、入力したデータによって決まります。同じハッシュ関数に同じデータを入力すれば、何度計算しても同じハッシュ値になります。

② 異なるデータから同じハッシュ値が得られることがある

ハッシュ関数では、多くの種類のデータを、限られた範囲の値に対応させます。

そのため、異なるデータから同じハッシュ値が得られることがあります。この現象を衝突といいます。

例えば、整数を10で割った余りをハッシュ値とする場合、13と23はいずれも余りが3になります。

13 mod 10 = 3
23 mod 10 = 3

このように、異なる入力から同じハッシュ値が得られることを衝突といいます。ここで、modは割り算の余りを求める演算を表します。

③ 用途によって計算方法や必要な性質が異なる

ハッシュ関数には、割り算の余りを利用するような単純なものもあれば、複雑な計算を行う暗号学的ハッシュ関数もあります。

単純なハッシュ関数は、配列の格納位置を求める場合などに利用されます。一方、ファイルの改ざん検出などでは、意図的に衝突を起こすことが難しい、安全性の高い暗号学的ハッシュ関数が必要になります。

暗号学的ハッシュ関数

情報セキュリティでは、SHA-256などの暗号学的ハッシュ関数が利用されます。

暗号学的ハッシュ関数には、次のような特徴があります。

① 入力データの長さにかかわらず、一定の長さの値が得られる

例えば、SHA-256では、入力したデータの長さにかかわらず、256ビットのハッシュ値が得られます。

256ビットは16進数で64桁に相当します。ファイルが数KBでも数GBでも、得られるハッシュ値の長さは同じです。

② 入力データが少し変わるだけで、ハッシュ値が大きく変化する

暗号学的ハッシュ関数では、元のデータが1ビットだけ変わった場合でも、ハッシュ値は通常、大きく異なる値になります。

この性質は、ファイルの一部が書き換えられた場合などに、その変化を検出するために役立ちます。

③ ハッシュ値から元のデータを復元することが難しい

安全な暗号学的ハッシュ関数は、ハッシュ値だけから元のデータを求めることが実用上困難になるように設計されています。

④ 同じハッシュ値をもつ異なるデータを見つけることが難しい

異なるデータから同じハッシュ値が得られる衝突は、理論上避けられません。しかし、安全な暗号学的ハッシュ関数では、衝突するデータの組合せを見つけることが非常に難しくなるように設計されています。

このような性質を利用することで、ファイルの内容を比較したり、改ざんを検出したりできます。

ハッシュ値による改ざん検出と完全性

情報セキュリティの重要な要素には、機密性・完全性・可用性があります。

このうち、ハッシュ値の照合が主に関係するのは完全性です。

完全性とは、情報が不正に変更されたり、破壊されたりしていない状態が保たれていることです。

例えば、ソフトウェアの配布元が、ダウンロード用ファイルとともに正しいハッシュ値を公開している場合を考えます。

利用者は、ダウンロードしたファイルから同じハッシュ関数でハッシュ値を計算し、配布元が公開した値と比較します。

二つのハッシュ値が一致した場合

ファイルの内容が配布元のものと同じである可能性が非常に高いと判断できます。

ただし、ハッシュ値の衝突が理論上起こり得るため、必ずしも一致を保証するわけではありません。

二つのハッシュ値が一致しなかった場合

ファイルの内容が異なっていると判断できます。

通信中のデータの破損、保存時の異常、第三者による改ざんなどが考えられます。そのため、ファイルを実行せず、入手経路を確認して再取得するなどの対応が必要です。

なお、ハッシュ値を比較する際には、比較対象となる正しいハッシュ値を信頼できる方法で入手することが重要です。

攻撃者がファイルと公開ハッシュ値の両方を書き換えた場合、単純に値を照合するだけでは不正を発見できないことがあります。

配布元から安全に入手したハッシュ値と、受信したファイルから計算した値を比較する図。一致すれば内容が同じである可能性が高く、不一致なら破損や改ざんなどが考えられます。

デジタル署名とハッシュ値

デジタル署名は、データの改ざんを検出し、署名に使用された秘密鍵の持ち主を確認するための仕組みです。

デジタル署名には、暗号学的ハッシュ関数と公開鍵暗号方式などの技術が利用されます。

一般的なデジタル署名の処理では、送信者は送信するデータからハッシュ値を計算し、自分の秘密鍵を使って署名を作成します。

受信者は、送信者の公開鍵を使って署名を検証します。この検証では、受信したデータから計算したハッシュ値などを利用し、署名がそのデータに対して正しく作成されたものかを調べます。

署名の検証が成功すれば、署名後にデータが変更されていないことと、対応する秘密鍵を持つ者が署名したことを確認できます。

一方で、その公開鍵が本当に送信者本人のものであるかについては、電子証明書などによって確認する必要があります。

ブロックチェーンとハッシュ値

ブロックチェーンは、取引などの記録をまとめた「ブロック」を、順序を保ちながら鎖のようにつなげて管理する技術です。

一般的なブロックチェーンでは、各ブロックに、取引データなどとともに直前のブロックのハッシュ値などが記録されます。

例えば、ブロックA、B、Cが順番につながっている場合、ブロックBにはブロックAのハッシュ値が、ブロックCにはブロックBのハッシュ値が記録されます。

このとき、過去のブロックAの内容が書き換えられると、ブロックAのハッシュ値が変化するため、ブロックBに記録されている値との整合性が失われます。

このように、ハッシュ値を利用してブロック同士を関連付けることにより、過去の記録の改ざんを検出しやすくしています。

さらに、複数のコンピュータで記録を共有し、記録の正しさを確認する仕組みなどと組み合わせることで、不正な書き換えを難しくしています。

各ブロックが直前のブロックのハッシュ値を記録してつながる図。ブロックAの内容を書き換えるとハッシュ値が変わり、ブロックBに記録された値と不整合になります。

ハッシュ値を利用したデータの検索

ハッシュ値は情報セキュリティだけでなく、データの格納や検索にも利用されます。

データの値からハッシュ関数によって格納位置を求め、その位置にデータを保存する仕組みをハッシュ表(ハッシュテーブル)といいます。

例えば、10個の要素をもつ配列A[0]~A[9]に、整数のデータを格納する場合を考えます。

ハッシュ関数を、

h(k) = k mod 10

とすると、整数kを10で割った余りが格納位置になります。

例えば、16は10で割った余りが6なので、A[6]に格納します。43は余りが3なので、A[3]に格納します。

この方法では、検索したいデータから格納位置を直接計算できるため、先頭から順番に探す方法と比べて、効率よく検索できる場合があります。

この方法では、異なるデータから同じ格納位置が求められることがあります。

例えば、43と73はいずれも10で割った余りが3なので、どちらもA[3]に格納しようとします。

このような衝突に対応するためには、別の格納位置を調べるなどの工夫が必要になります。

43と73を10で割った余りはいずれも3となり、どちらもハッシュ表のA[3]を指します。先に43をA[3]へ格納し、73は次の空き位置A[4]へ格納する例です。

ハッシュ値について注意すること

ハッシュ値を理解するときは、特に次の点に注意する必要があります。

  • ハッシュ値は暗号化されたデータではありません。ハッシュ値を復号して元のデータを復元することはできません。
  • ハッシュ値が一致しても、元データが必ずしも同じとは限りません。異なるデータから同じ値が得られる衝突が理論上起こり得るためです。ただし、安全な暗号学的ハッシュ関数では、意図的に衝突を見つけることが非常に難しくなっています。
  • データの検索用とセキュリティ用では、ハッシュ関数に求められる性質が異なります。検索用のハッシュ関数は格納位置を効率よく計算することを重視しますが、暗号学的ハッシュ関数は元データの推測や意図的な衝突を困難にすることを重視します。

また、ハッシュ値は、データの著作権者、圧縮率、ファイルのパスワードなどを直接表すものではありません。

ハッシュ値とは、データから一定の規則で計算される値であり、その性質を利用して、データの完全性の確認、同一内容のファイルの検索、効率的なデータの格納や検索など、さまざまな処理を実現するものです。

EXAMPLE

例題

ハッシュ値 · EXAMPLE情報セキュリティマネジメントR5公開問題 問5(改題)

送信者が公開したハッシュ値と、受信したファイルから計算したハッシュ値が一致した。この結果から主に判断できることはどれか。

  1. 0

    ファイルの著作権者

  2. 1

    ファイルの圧縮率

  3. 2

    ファイルが改ざんされていない可能性

  4. 3

    ファイルを開くためのパスワード

解答・解説を確認

正解2.ファイルが改ざんされていない可能性

解説

ハッシュ値はデータから計算される短い値で、元データが少し変わると値も変わります。したがって、改ざん検出に利用できます。

出典
情報セキュリティマネジメントR5公開問題 問5(改題)

PRACTICE

ハッシュ値の問題に挑戦