現代のセキュリティにおいてハッシュ関数は非常に幅広く、重要な役割を担っています。ここでは、まずハッシュ関数とはいったいどういったものなのかを確認しておきましょう。

ハッシュ関数とは何か?

ハッシュ関数とは、テキストファイルや画像データ、動画データなどさまざなな任意のデータから、予め定められたルールに乗っ取って値を出力する関数のことです。ここで出力された値のことをハッシュ値といいます。
同じ元のデータから作成されたハッシュ値は常に同じ値になります。また、元のデータがわずかでも(たとえテキスト一文字であったとしても)変更されていれば、ハッシュ値は全く違ったものになります。
関数という表現が少しわかりにくいかもしれませんが、関数は箱のようなもので、データを与えると処理を行うものだと考えてください。


また、先ほどの予め定められたルールのことをハッシュアルゴリズムといいます。

ハッシュ関数の概念

ハッシュ関数はさまざまな用途で使用されますが、セキュリティの世界で用いるためには、いくつかの性質が求められます。次はその必要な性質について見ていきましょう。

ハッシュ値のサイズが一定であること

ハッシュ関数を実行した結果であるハッシュ値は、ハッシュアルゴリズムによって一定のサイズになります。

例えば有名なハッシュ関数に「SHA-256」というものがありますが、この関数にかけた結果は全て256ビットになります。
下記の例は、Linux上でSHA-256の処理を行うためのコマンドである「sha256sum」を使って、テキストファイルである「test.txt」のハッシュ値を求めたものです。結果が256ビットで表示されているのがわかるかと思います。

sha256の出力結果

なお、結果であるハッシュ値をみると、一見暗号化された値のように見えるかもしれませんが、ハッシュ処理自体は暗号化ではありませんので注意してください。

一方向性

一方向性もハッシュ関数に求められる重要な要素です。これは、ハッシュ値のみを与えられたときに、そこから元のデータを見つけることができないという性質です。
元のデータからハッシュ値は導き出せますが、そのハッシュ値からは元のデータを推察することはできないのです。

衝突困難性

ハッシュ値が同じになる元データを他に見つけることが困難であることを、衝突困難性といいます。別のデータのハッシュ値が偶然同じ値になるということは原則としてありません。厳密にいうと、理論上はあり得るのですが、現実としてハッシュ関数を扱うにあたっては、その発生確率が無視できるくらいに小さいということになります。

まとめ

こういった性質を持つハッシュ関数は安全であるということができます。以前はMD5というハッシュ関数がよく用いられていましたが、攻撃方法が確立されてしまっており、いまでは安全とはいえず、利用が推奨されていません。

MD5は1992年に規格が確立して、広く利用されるようになりましたが、その後12年後に危険性が指摘されるようになりました。このように、利用されるハッシュ関数は時代とともに変化していきます。安全ではないとされるものを利用するのは避けるようにしてください。

なお、前述のSHA-256は規格が制定されてからかなりの時間が経っていますが、現時点では問題は見つかっておらず、広く普及しています。

ハッシュ関数は非常に多岐に亘って利用されています。

例えば、元データが第三者によって改ざんされていないかどうかを検知したり、インターネットからダウンロードしたファイルが破損していないかどうかの調査にも用いられます。また、パスワードのような重要な機密データをそのままサーバーなどに保管しておくと、簡単に覗き見られてしまい、大変危険です。そのため、ハッシュ値に変換して保存するなどという工夫がされています。
こういったことができるのも、一方向性のような性質をハッシュ関数が持っているからこそ実現できるのです。

次回以降、こういったハッシュ関数の具体的な活用例を紹介していきます。