ハッシュを使って、偽ファイルを簡単に見つける

サーチマン佐藤です。
こんにちは。

今さらですが、
我々の周りはデータだらけです。

しかし、そのデータは、
本物か?という話をします。

例えば、アナタが何か
プログラムファイルを作った。

しかし、誰かが、
そのファイルを改ざんして、
ウィルスを入れた。

さて、本物と偽物のファイル、
一体どうやって見分ける?

例えば、それは、テキストでも、
画像でも音楽でもいいですよ。

何か改ざんがあった場合、
どうやって見分けるのか?

以下のクイズからいきましょう。

以下、ご覧ください。

かに道楽1

かに道楽2

かに道楽3

かに道楽4

私が大阪に行った時に撮った
「かに道楽本店」です。
(どーでもいいですが、笑)

4つ画像ファイルがありますが、
3つは同じファイルです。

画像ファイルをダウンロードして、
検証してみて欲しいのですが、

これら4つの画像ファイルは、
全て同じに見えますが、
実は、1つだけ改ざんしました。

さて、
その改ざんした画像ファイルは、
どれでしょうか?

・・・考えてくださいね。

では、答えにいきましょう。

答えは、「かに道楽2」です。
その方法は、ハッシュを使います。

・・・ハッシュ。

知らない人も多いので、
一応、簡単に解説すると、

全てのファイルの中身は、
(1文字でも、1Gでも)
ファイルサイズに関わらず、

ハッシュ関数にかけると、
固定長の文字列になる。

えっ?!

って気分でしょうが、
続けて聞いてください。

で、重要なのは、
中身が少しでも違えば、
固定長の文字列の中身も、
全く違ったものになる。

この特徴です。

たぶん、初めて聞くと、
こんな疑問がわく。

ファイルの中身なんて、
無限にあるのに、

それらは全て、
固定長の文字列で
ユニーク表現できるのか?

衝突しないのか?と。

はい、疑問はごもっともですが、
衝突ないし、ユニークなのです。

まあ、本当に衝突なしってのは、
別途で議論もあるのですが、
我々レベルで扱うなら、
衝突ゼロでいいのです。

なので、結論だけ言えば、
中身が少しでも違えば、
ハッシュ値は違ってくる。

この特性で調べるのです。

・・しっくりこない方、
具体的にいきましょうね。

どんなファイルでもいいですが、
例えば、今回のクイズなら、
ファイル(kani1.jpg)に対して、

Windowsの場合は、
コマンドプロンプトで、
> certutil -hashfile kani1.jpg
という感じで使います。

Macの場合は、ターミナルで、
$shasum kani1.jpg という感じ。

たぶん、こんな値がでる。
dc4126182fb677db9b793cca14355fc854471e4c

これを、1~4.で調べると、
違いがわかりますね。

まあ、ハッシュ関数は、
色んなロジックがあるので、
上記は一つの例ですが、

同じロジックで調べれば、
kani2.jpgだけ違うのがわかります。

簡単にできるし、ハッシュは、
セキュリティやビットコイン、
色々使われている基本技術なので、
是非、一度は試してみましょうね。

ではでは、
またお会いしましょう。

ありがとうございました。