概要

ハッシュ関数とは、入力されたデータから固定長のハッシュ値を出力する関数です。ハッシュ関数の用途や主なハッシュ関数について解説します。

ハッシュ関数とは

ハッシュ関数とは、入力されたデータから固定長のデータ(ハッシュ値)を出力する関数です。ハッシュ値はメッセージダイジェストやフィンガープリント(指紋)とも呼ばれます。

ハッシュ値は入力データよりも短くなることがほとんどなので、ハッシュ関数によってデータを圧縮していると考えることもできます。ただ、データの圧縮といってもハッシュ値から元のデータを復元することはできません。

図 ハッシュ関数
図 ハッシュ関数

ハッシュ関数の「ハッシュ(hash)」は、「切り刻む」という意味です。「ハッシュドビーフ」や「ハッシュドポテト」の「ハッシュ」です。もとのデータを切り刻んで小さくするといった意味合いです。

ハッシュ関数に必要な条件として、以下が挙げられます。

  • 出力したハッシュ値から入力データを推測することが困難
  • 異なる入力データに対して同じハッシュ値になる(ハッシュの衝突)ことが少ない
  • 簡単に計算できる(計算コストが低い)

ハッシュ関数の用途

ハッシュ関数に入力されたデータが異なると、出力されるハッシュ値も(ほぼ)異なります。そして、同じ入力データなら同じハッシュ値が出力されます。この性質を利用して、ハッシュ関数によりデータの一意性を確保できます。ハッシュ関数の主な用途として以下が挙げられます。

  • データの改ざん、誤り検出
  • パスワードの安全な保管
  • 高速な検索処理

データの改ざん、誤り検出

WebサイトからOSのISOファイルやプログラムのインストーラなどをダウンロードするときに、ハッシュ値が記載されていることがあります。ダウンロードしたファイルのハッシュ値と記載されているハッシュ値が一致していれば、ファイルは改ざんされたり破損したりしていないことを確認できます。たとえば、UbuntuのWebサイトにISOファイルのハッシュ値が記載されていて、ダウンロードしたファイルを検証できるようにしています。

http://releases.ubuntu.com/22.04.2/

デジタル署名でもハッシュ関数を利用したデータの改ざん、誤り検出を行っています。

パスワードの保管

パスワードの保管時に、パスワード自体を保管するのではなく、ハッシュ値を保管しておきます。入力されたパスワードのハッシュ値を計算して、保管しているパスワードのハッシュ値と比較すれば、パスワードを検証できます。

不正アクセスなどでアカウント情報が漏洩したとしても、パスワードのハッシュ値が知られるだけでパスワードそのものを知られることはありません。パスワードのハッシュ値からもとのパスワードを推定することは非常に難しいからです。

図 パスワードの保管
図 パスワードの保管

2011年にソニーのPSN(Play Station Network)のアカウント情報が漏洩しました(1ヶ月ほどオンラインマルチプレイができなくてとても退屈でした)。アカウントのパスワードも漏洩したと報じられていましたが、パスワードそのものが漏洩したわけではありません。漏洩したのはパスワードのハッシュ値です。パスワードのハッシュ値が知られただけでは、アカウントに不正にログインされる可能性は非常に低いです。筆者のPSNアカウントも不正にアクセスされるようなことはありませんでした。ただ、パスワードのハッシュ値が知られてしまうことはやはり問題です。

https://cdn.jp.playstation.com/msg/sp_20110427_psn.html

高速な検索処理

ハッシュ関数によって固定長のハッシュ値を出力することを利用して、高速な検索処理を行うことができます。ハッシュ関数を利用した高速な検索処理を行うためにハッシュテーブルがあります。ハッシュテーブルとは、ハッシュ関数を使ってキーを配列のインデックスに変換し、データの検索を高速化するためのデータ構造です。

主なハッシュ関数

主なハッシュ関数として以下が挙げられます。

  • MD5
  • SHA-1
  • SHA-2
  • SHA-3

MD5

MD5はRFC1321で規定されているハッシュ関数です。入力されたデータから128ビットの固定長のハッシュ値を出力します。非常によく利用されているハッシュ関数ですが、セキュリティ上の問題点が指摘されています。現在では、MD5の利用は推奨できません。

SHA-1

SHA-1は、アメリカ国立標準技術研究所(NIST)で標準化されているハッシュ関数です。入力されたデータから160ビットの固定長のハッシュ値を出力します。MD5と同様にセキュリティに問題点があります。SHA-1の利用も推奨できません。

SHA-2

SHA-1を改良したハッシュ関数がSHA-2です。SHA-2には、出力するハッシュ値のサイズからいくつかのバリエーションがあります。

SHA-2のバリエーションハッシュ値のサイズ
SHA-224224ビット
SHA-256256ビット
SHA-384384ビット
SHA-512512ビット
SHA-512/224224ビット
SHA-512/256256ビット

SHA-3

SHA-3はSHA-1/SHA-2とは異なるコンセプトのハッシュ関数です。もとはKeccakというハッシュ関数で2015年にSHA-3として標準化されています。SHA-3で出力されるハッシュ値のサイズは224,256,384,512ビットです。

ハッシュ関数ハッシュ値のサイズ(ビット)備考
MD5128RFC1321
SHA-1160FIPS PUB 180-4
SHA-224224FIPS PUB 180-4
SHA-256256FIPS PUB 180-4
SHA-384384FIPS PUB 180-4
SHA-512512FIPS PUB 180-4
SHA-512/224224FIPS PUB 180-4
SHA-512/256256FIPS PUB 180-4
SHA3-224224FIPS PUB 202
SHA3-256256FIPS PUB 202
SHA3-384384FIPS PUB 202
SHA3-512512FIPS PUB 202

まとめ

ポイント

  • ハッシュ関数とは、入力されたデータから固定長のデータ(ハッシュ値)を出力する関数です。
  • ハッシュ関数の主な用途として、以下があります。
    • データの改ざん、誤り検出
    • パスワードの安全な保管
    • 高速な検索処理
  • 主なハッシュ関数として、以下があります。
    • MD5
    • SHA-1
    • SHA-2
    • SHA-3

セキュリティの基礎