「メモ」と「メモのコピー」。名前が違う二つのファイルを見て、中身も違うのか気になったことはありませんか。反対に、同じ名前のまま内容だけが書き換わることもあります。
ハッシュ値は、ファイルの中身から決まった方法で計算する、照合用の値です。 中身と計算方法が同じなら、ファイル名が違っても同じ値になります。名前の札ではなく、保存されているデータを比べるための手がかりです。
名前を変えたメモを、同じ方法で比べる
ラボでユイが、小さなメモを二つ用意しました。ファイル名は memo.txt と copy.txt。どちらにも、英語で猫を表す3文字の cat だけが入っています。
この二つを、SHA-256という方法で計算してみます。SHA-256は、ハッシュ値を求める計算方法の一つです。画面では、結果を0〜9とa〜fの英数字で表した64桁の値を見かけます。
| ファイル名 | 保存した文字 | SHA-256の先頭8桁 |
|---|---|---|
| memo.txt | cat | 77af778b… |
| copy.txt | cat | 77af778b… |
ここでは見比べやすいよう先頭だけを載せていますが、実際に計算した64桁すべてが一致しました。名前だけを変えても、中身のデータが変わらなければ、ハッシュ値は変わりません。
ユイ
名前が違っても、計算するのは中の文字なんですね。
ピコ
そう。今度は名前をそのままにして、中の c を大文字にしてみよう。
一文字変えると、結果はどうなる?
memo.txt の中身を cat から Cat に変え、同じSHA-256で計算すると、今度は 48735c4f… で始まる値になりました。ファイル名は同じでも、計算に使うデータが変わったからです。
名前を変えることと、中身を書き換えること。この二つは、画面の見た目よりもはっきり区別できます。ハッシュ値は、コピーしたデータが元のものと一致するか、配布されたファイルと手元のものが一致するかを確認するときに使われます。
この例で計算した64桁をすべて見る
3文字をUTF-8という文字の保存方式で記録し、先頭に付くことがある印「BOM」と、末尾の改行は入れていません。この条件で実際にSHA-256を計算しています。
cat(memo.txtとcopy.txtは同じ)
77af778b51abd4a3c51c5ddd97204a9c3ae614ebccb75a606c3b6865aed6744e
Cat(先頭の一文字を変更)
48735c4fae42d1501164976afec76730b9e5fe467f680bdd8daff4bb77674045
自分でメモを作って試すときは、見えない改行が末尾に付いているだけでも、上の例とは違うデータになります。保存方式によって、記録されるデータが変わることもあります。「見える文字が同じ」と「保存されたデータが同じ」は、いつも同じ意味ではありません。
写真にも似たことが起こります。目で見た絵が変わらなくても、撮影情報など、画像ファイルの中に記録された情報が変われば、同じデータとはいえなくなります。ハッシュ値が調べるのは、写真が似ているかどうかではなく、ファイルの中身です。
同じ方法で計算し、値の全体を比べる
ハッシュ値を比べるには、両方を同じ方法で計算します。片方がSHA-256、もう片方が別の方法なら、その二つの値をそのまま照合しても、中身が同じかは判断できません。
ダウンロードページに「SHA-256」と長い値が載っていたら、手元のファイルもSHA-256で計算し、値の全体を比べます。上の表のような先頭だけの一致では、確認したことになりません。配布元が複数の版を用意している場合は、自分が受け取った版の値を選びます。
同じ計算方法で値が違えば、データも違います。値が一致すれば、データが同じか確かめるための強い手がかりになります。ただし、異なるデータから同じ値が出ることは数学的にあり得ます。この重なりを「衝突」と呼びます。SHA-256のような暗号学的ハッシュでは、そのような組み合わせを現実的な計算で見つけにくくするよう設計されています。
文字列を一つひとつ覚える必要はありません。「同じ方法で計算したか」「同じ版の、値の全体を比べたか」が分かれば、長い英数字の見るべき点がつかめます。
暗号化や、安全性の判定とは役割が違う
ハッシュ値は、元の文書や写真を小さく保存し直したものではありません。SHA-256なら、大きな写真でも短いメモでも、計算結果の長さは同じです。写真の内容をすべて残しているわけではないので、ハッシュ値から写真を取り出す、という使い方はできません。
ここが、鍵を使って元の内容に戻す暗号化のしくみとの違いです。ハッシュ値を作るだけで、元ファイルが読めなくなるわけでもありません。cat のメモは、計算したあともそのまま読めます。
また、ハッシュ値の一致は「このファイルを使って安全」という判定ではありません。 危険なプログラムを同じ内容のままコピーしても、値は一致します。照合相手の値も、信頼できる配布元の案内から確かめる必要があります。
ハッシュ値が教えてくれるのは、中身を比べた結果です。誰が配布しているか、そのファイルを開いてよいかという判断まで、長い英数字が代わりにしてくれるわけではありません。
次にファイル名を変えたら
最初の二つのメモを思い出してみてください。memo.txt を copy.txt に改名しても、中身が cat のままなら同じ値。名前を残したまま Cat に書き換えた例では、別の値になりました。
次にファイル名を変えたら、「変えたのは名前で、中身はそのまま」と考えてみてください。ハッシュ値が比べるのは、その中身です。
では、写真の名前の末尾を .jpg から .png に変えるだけで、保存のしくみも変わるのでしょうか。ファイル形式と拡張子の違いを読むと、名前と中身の関係をもう一歩確かめられます。
この記事について
LAB WHITEBOARD
ファイルのハッシュ値を一文で説明してみよう
「名前と中身を分け、同じ方法で計算したハッシュ値の用途と限界を説明できる。」を、いまの自分の言葉で一文にしてみてください。途中の説明でも大丈夫です。




