ハッシュ値とは
ハッシュ値(hash値)
ハッシュ値とは、『ハッシュ、ハッシュ値 – データから算出した小さな値。各データを区別・表現する目的に用いる。』とウィキペディアに記されています。つまり、あるデータデータを切り刻んで(hash)小さくした値です。※hash:切り刻むという意味。ハッシュドポテトのハッシュです。
この小さくした値は、データの格納や検索に利用されていたり、暗号やパスワードに利用されていたりします。また、ダウンロードしたソフトウェアが破損や改竄の確認にも利用されています。
今回はダウンロードしたソフトウェアの確認にどのようにハッシュ値やハッシュ関数が利用されているのか、見てみます。実際の確認方法は実践編(Linux,mac)と実践編(Windows)、実践編(Windows#2)をご覧ください。
ハッシュの仕組み
ハッシュ関数
ハッシュ関数とは、『あるデータが与えられた場合にそのデータを代表する数値を得る操作、または、その様な数値を得るための関数のこと。』とウィキペディアに記されています。ちょっと難しそうに書いてありますが、「ハッシュ値を計算するための関数」です。関数と聞くとなんだか難しそう?それは気のせいですが、『値』を渡せばその値のハッシュ値を計算してくれるものです。コンピュータの場合、この『値』として実際のデータを渡すことになります。
ハッシュ関数は目的に応じて求められる要件が異なります。以下のようにハッシュ関数の要件をいくつかまとめてみました。
※あくまで簡易的にまとめたものです。厳密な要件知りたい方はご自分でお確かめください。
ハッシュ関数の目的別の要件
求められる要件 | 使用目的 | 備考 |
---|---|---|
同じ値(データ)に対して計算されるハッシュ値は何度計算しても同じであること | 全項目共通 | これが崩れるとハッシュ値として利用できない |
類似する値(データ)を渡した場合、計算されるハッシュ値が同じもしくは近い値(連続性) | 検索 | 暗号や改竄検知ではこの要件は不適 |
ハッシュ値からもとの値を推測できない(原像計算困難性) | セキュリティ | 推測できる場合、暗号には不適 |
同じハッシュ値を生成できる別の値(データ)を推測できない(第2原像計算困難性) | セキュリティ | 推測できる場合、暗号には不適 |
同じハッシュ値になる異なる2つの値(データ)を推測できない(衝突困難性) | セキュリティ | 推測できる場合、暗号には不適 |
計算で出てきたハッシュ値が偏らない | セキュリティ | 偏りがあれば、第2原像計算困難性が崩れる可能性が高い |
もとの値が少し変わっただけでハッシュ値が変わる | セキュリティ | 変わらない場合、衝突困難性が崩れる可能性が高い |
ハッシュ値を利用した方が計算が早い | 検索 | 遅くなった場合はハッシュ値を使う意味がない |
※ほかにも目的ごとに様々な要件があります。
MD5,SHA1
ところで、PCなどでソフトウェアをダウンロードする際に「MD5」や「SHA1」という名前の値が書かれていることがあります。この「MD5」や「SHA1」はセキュリティ分野で利用されているハッシュ関数です。ソフトウェアとともに公開されている値は、そのソフトウェアのハッシュ値をMD5やSHA1でも計算したものです。
これらのハッシュ関数はセキュリティ分野で利用されているため「同じハッシュ値をになるデータを推測困難」「データが少しでも変われば値が変わる」「計算されるハッシュ値に偏りがない」といった要件を満たしています。ソフトウェアをダウンロードする際に、ソフトウェアの作成者が公開しているMD5やSHA1の値と、自分がダウンロードしたソフトウェアのMD5やSHA1の値が一致すればそのソフトは改竄されていない本物だと確かめることができます。その仕組みはどうなっているのでしょうか。
改竄検知の仕組み
あなたがダウンロードしたファイルには「このファイルのハッシュ値はMD5で12345※です。」と書かれていたとします。※もちろん、架空の値です。
あなたはファイルをダウンロードした後、ご自身のPCでそのハッシュ値を調べました。
そのとき計算された値が「12346」だった場合は、ハッシュ値が異なっています。これは計算の際に利用されたデータと元のデータが異なっているということを示します。この場合、あなたがダウンロードしたファイルはダウンロードに失敗して壊れていたり、改竄されていたり、といったことが考えられます。
では、あなたがダウンロードしたファイルのハッシュ値が「12345」になった場合はどうでしょうか。この場合、ファイルは改竄されていないと判断できるのでしょうか。
MD5やSHA1はセキュリティ分野で利用されているハッシュ関数なので、以下のような特性を持っています。
・ハッシュ値が被りにくい
・同じハッシュ値になる別の入力値を推測しにくい
・入力値からハッシュ値を推測しにくい
これらから、ハッシュ値が同じで改竄されたデータだった場合、改竄した人は「同じハッシュ値になるように調整しながら」データを改竄したことになります。しかし、入力値からハッシュ値を推測することが困難であれば、これは非常に難しいと言えるでしょう。つまり、MD5 やSHA1の入力値からハッシュ値を推測できるようにならない限り、改竄は容易ではないと判断できます。
そのためソフトウェアをダウンロードした際にMD5やSHA1が一致していれば、本物のソフトと判断できます。
ただし、そもそもソフトウェアのダウンロードの際に書かれているMD5やSHA1の値そのものが改竄されていた場合はファイルの改竄検知はできません。では、表示されているハッシュ値そのものの正しさはどのように検証するのか、という話になりますが、そちらを説明すると様々な技術の話が出てきて超大作ができてかなりの量になるのでここでは割愛します。もしもご自身でファイルとそのハッシュ値を公開する場合はそちらについても調べてみてください。
また、コンピュータの性能は時代を追うごとにが上がっています。また、セキュリティやそれを破る技術も日々進歩しています。そのため現在利用されている暗号などにもいつか寿命がきます。ハッシュ関数に限らず、大事なのは「暗号やセキュリティはいずれ破られる」という前提の元、行動することです。
では実際にハッシュ値を確認してみましょう。