2014年4月16日

驚くべきハッシュの世界

セキュリティ ヒント

暗号学的ハッシュ関数(単にハッシュと呼ばれることが多い)は、任意のデータのブロックを、決まった長さの新しい文字列に変える数学アルゴリズムです。同じタイプのハッシュは、入力されたデータの長さに関係なく、必ず同じ長さのハッシュ値を出力します。

hash

したがって、オンラインのSHA-1ハッシュ生成ツール(SHA-1は、MD5やSHA-2と同じく、コンピューティングで広く利用されているハッシュ関数の1つ)で、私の名前「Brian」のハッシュ値を生成すると、「75c450c3f963befb912ee79f0b63e563652780f0」となります。他のBrianという名前の人も皆そう言うと思いますが、スペルを間違って「brain」(脳)と書かれることがとても多いのです。あまりにもこの間違いが多く、正式な運転免許証で私の名前が「Brain Donohue」となっていたこともありました。話が脱線してしまいましたが、「brain」のSHA-1ハッシュを同じSHA-1生成ツールで生成すると、「8b9248a4e0b64bbccf82e7723a3734279bf9bbc4」でした。

ご覧のとおり、この2つの出力値はまったく違いますが、「Brian」という名前と、中枢神経系の中心の臓器を意味する単語の違いは、連続する2つの母音(iaとai)の並び方だけです。この点をさらに掘り下げて検証するために、私の名前の最初の文字を小文字で入力してみたところ、SHA-1生成ツールからまた大きく異なるハッシュ値が返ってきました。「760e7dab2836853c63805033e514668301fa9c47」です。

この3つのハッシュがすべて40文字であることにお気づきだと思いますが、どれも入力値の長さが5文字であるため、不思議なことではありません。しかし、驚いたことに、本記事(英語版)のここまでの単語すべてをハッシュ生成ツールに入力すると、「db8471259c92193d6072c51ce61dacfdda0ac3d7」というハッシュ値が返されます。この記事の1,637文字(スペースを含む)が、先述の5文字の単語と同じように、40文字の出力値に圧縮されたのです。ウィリアム・シェイクスピア(William Shakespeare)の作品全集をSHA-1ハッシュにかけたとしても、出力は40文字になります。また、2つの異なる入力値で同じハッシュ値が出力されることはありません。

暗号学的ハッシュ関数は、コンピューティングで広く利用されており、ID認証からマルウェアの検知、ファイルの保護まで、その用途は多岐にわたります

図で見て理解したいという人のために、このコンセプトを説明するWikimedia Commonsの画像を引用します。

暗号ハッシュの説明

ハッシュは何のために使われるのか?

すばらしい質問です。が、残念ながら、暗号ハッシュの使い道は多岐にわたる、とお答えしなければなりません。

専門家以外の人が一番よく目にするハッシュはパスワード関連です。たとえば、何かしらのオンラインサービスのパスワードを忘れてしまった場合、パスワードのリセットを実行するでしょう。パスワードをリセットしたときに、平文のパスワードを受け取ることは、まずないはずです。なぜなら、オンラインサービスはパスワードを平文で保存していないからです。保存されているのはパスワードのハッシュ値で、むしろオンラインサービスは実際のパスワードを知りません(ただし、あまりにも簡単なパスワードを使っていて、そのハッシュ値が広く知られている場合は別です)。

もし平文のパスワードが送られてくるようなことがあれば、それはお使いのオンラインサービスがパスワードをハッシュ化していないということであり、利用をやめるべきです。

これはオンラインのハッシュ逆引きツールを使って自分でテストできます。「password」や「123456」といったぜい弱なパスワードのハッシュ値を生成して、その値をハッシュ逆引きツールに入れると、両方のパスワードのハッシュ値が認識されるでしょう。私の場合、「brain」や「Brian」のハッシュは逆引きツールに認識されましたが、この記事の本文のハッシュは認識されませんでした。したがって、ハッシュの出力値の完全性は、ひとえに入力データ次第であると言えます。文字通りどんなデータでも入力できますが、適切なものを選ばなければなりません。

これに関して、TechCrunchが先月末に記事を公開しています。人気のクラウドストレージサービスDropboxは、あるユーザーがデジタルミレニアム著作権法(DMCA)で保護されたコンテンツを共有していたところ、その共有をブロックしました。このユーザーが特定のコンテンツの共有をブロックされたとツイートすると、Twitterでちょっとした騒ぎになり、Dropboxはユーザーのコンテンツを見ないとプライバシーポリシーで約束しているのに、コンテンツを探し回っているに違いない、という怒りの声が広がりました。

Dropboxはもちろん、ユーザーのコンテンツを探し回っていたわけではありません。TechCrunchの記事に書かれているように、おそらくは、著作権者が自社で版権を持つファイル(音楽や映画のデジタル版)をハッシュ関数にかけたというのが真相でしょう。そして、出力されたハッシュ値の40文字を、著作権ファイルのハッシュ値のブラックリストのようなものに登録したはずです。ユーザーがこの著作権で保護されたファイルを共有しようとすると、Dropboxの自動スキャナーがハッシュのブラックリストを調べて、共有をブロックしたというわけです。

このように、パスワードやメディアファイルをハッシュできることは明らかですが、暗号学的ハッシュ関数には他にどんな目的があるのでしょうか?また同じような答えになりますが、ハッシュ関数には数多くの目的があります。それこそ、私が知っているよりも、理解しているよりも、書きたいと思うよりも、ずっと。とはいえ、Kaspersky Dailyをご覧の方になじみ深い用途がもう1つあります。ハッシュは、Kaspersky Labのようなアンチウイルス企業のマルウェア検知手段として広く利用されているのです。

ある意味、映画制作会社やレコード会社が著作権データを保護するためにハッシュのブラックリストを作るのと同じように、マルウェアのハッシュのブラックリストも無数に作成されており、そのほとんどが一般に公開されています。こうしたマルウェアのハッシュ(マルウェアのシグネチャ)のブラックリストには、マルウェアのハッシュ値や、もっと小さくて識別可能なマルウェアのコンポーネントのハッシュ値が登録されています。たとえば一例を挙げると、怪しいファイルを見つけた場合、公開されているマルウェアのハッシュデータベースのどれかにそのハッシュ値を入力すると、ファイルが悪質なものかどうかがわかります。また、アンチウイルスエンジンがマルウェアを認識してブロックする方法の1つは、ファイルのハッシュ値と、独自の(そして公開されている)マルウェアのシグネチャデータベースを比較することです。

暗号学的ハッシュ関数には、いわゆる「メッセージの完全性」を確認するという用途もあります。つまり、通信内容やファイルが改ざんされていないことを、データ転送の前と後のハッシュ出力を検証することで確認するのです。前と後のハッシュが一致すれば、通信が正常に行われたと言えます。