ハッシュ関数
ハッシュ関数とは、与えられたデータを、固定長の不規則な値に変換する関数である。
得られる不規則な値は、データの要約としての意味を持ち、様々な場面で利用されている。
ハッシュ関数での戻り値をハッシュ値といい、数字の並びになるハッシュ値は、16進数で表記することが多い。
コンピュータ内では全てのデータを「0」と「1」だけの2進数で管理している。
16進数表記のハッシュ値もまたデータであり、コンピュータ内部では2進数で管理している。
ハッシュ関数の特徴
- 出力する値のデータ長は変わらない。非常に大きなデータを入力しても、出力するハッシュ値のデータ長は変わらない。逆に、どんな小さなデータを入力しても出力するデータ長は同じ。
- 入力が同じ値なら出力するハッシュ値も必ず同じになる。ハッシュ関数のアルゴリズムはいくつか存在するが、「出力するハッシュ値が同じになる」のは同じアルゴリズムを用いた場合に限る。アルゴリズムが異なれば、たとえ入力したデータが同じでもハッシュ値は異なる。
- 非常によく似た、わずかしか違わないデータの入力でも、出力するハッシュ値は大きく異なった値となる。
- 全く別のデータを入力しても、同じハッシュ値になることが低確率ながらある。これをハッシュ値の衝突という。
- ハッシュ値から元のデータに逆算することは事実上不可能。データの、入力と出力の流れは一方向で、この点が暗号化と大きく違う所。
正真性を提供するハッシュ関数
インターネット経由でソフトウェアを入手したとする。このソフトウェアは間違いなく作成者が作ったものだろうか。入手する経路の途中で、悪意ある者が悪質な仕掛けをしていないだろうか。
セキュリティを意識したプログラム提供者の場合、書き換えられることを防ぐ為、プログラムを広範囲に公開すると共に、そのプログラムのハッシュ値を公開する場合がある。
プログラムを入手した者は、入手したファイルから自らハッシュ値を計算し、公開されているハッシュ値と比較する。この時に双方のハッシュ値が一致すれば、入手したソフトウェアは提供者のものであると確認できる。
ハッシュ関数は正真性(完全性)を提供する暗号技術で、データの改ざんを検出できる。
ユーザのパスワード保存にもハッシュ関数が利用されている
ユーザが入力したパスワードをサーバに保存する時もハッシュ関数が用いられる。
パスワードをそのままサーバに保存すると、このサーバ内を盗み見した悪意ある第三者が、元のパスワードを容易に知ることができる。ハッシュ値として保存しておけば、たとえ盗み見されたとしても、逆算して元のパスワードを知ることは事実上不可能である。
パスワードの保存では、パスワードのハッシュ値をとり、その値のみを保存しておく。そして、ユーザがパスワードを入力した時に、その入力された値のハッシュ値をとり、データベースのハッシュ値と比較する。