ハッシュの概要
ハッシュとは、あるデータを変換して得られる固定長のデータのことです。またハッシュを得るための関数をハッシュ関数といいます。ハッシュ関数は数値やドキュメントのような文字列など、どんな値でも指定の長さの数値に変換できます。
暗号関数はデータを暗号化したり復号できるのに対し、ハッシュ関数はあるデータを一方向にしか変換できないのが特徴で、ハッシュ化されたデータを元のデータに戻すことは基本的に不可能です。また、元のデータを一文字でも変更すると、ハッシュ化された結果は全く違うものとなり、ハッシュ化された結果から元データを推測することも不可能にしています。
よくハッシュが使われる場所として、ウェブサイトなどのパスワードの保存があげられます。ウェブサービスではパスワードをハッシュ化してデータベースに保存することがよくあります。フォームから入力されたパスワードのハッシュ値を取ったものと、データベースに保存されていたパスワードのハッシュ値を比較し、これらが一致するかを見てパスワードの確認しています。よって、ハッシュ化されたパスワードしかデータベースに保存されていないため、データベースに保存されている数値からパスワードは復元できず、いざデータベースの内容が漏洩したとしても一定の安全性が保たれます。
ビットコインなどのブロックチェーンににおいて、ハッシュはいたるところで使われています。特にマイニングでは何度もハッシュ関数を使うため、ハッシュを計算する効率がとても重要になってきます。そのために、ハッシュ計算に特化したハードウェアなども開発されています。
ビットコインで使用されるハッシュ関数はSHA256とRIPEMD160です。これらのハッシュはGPUや計算専用のハードウェアであるASICで計算するのに向いています。これに対し、他のブロックチェーンでは普通のPCでもマイニングしやすいように、GPUやASICでは計算しづらいハッシュアルゴリズムを使っているものも多く存在しています。
ビットコインで使われているSHA256は、任意の長さの原文から固定長の特徴的な値を算出するハッシュ関数の一つであり、どんな長さの原文からも256ビットのハッシュ値を算出することができます。SHA256は実装のしやすさや計算速度、暗号学的な安全性のバランスに優れ、広く普及しています。
ハッシュの例
上記のような特徴を理解するために、実際にデータをSHA256ハッシュ関数にかけて以下のように変換してみます。
このように、1文字または1ビット異なるだけで、ハッシュ値は全く異なる結果になります。
また長い文字列の場合でも、出力される数値の長さ(ビット数)は同じであることが特徴としてあげられます。よって、どんなに長い文字列も一定の長さに変換されるため、文章や画像ファイルを一意に要約する機能として、よく活用されています。
ダブルハッシュ
ダブルハッシュとは、ハッシュ関数を重ねて使うことです。一度ハッシュ関数に入れた出力値を、さらにまたハッシュ関数にかけます。ダブルハッシュを行うメリットは、一回ハッシュ関数を適用するよりも安全性が二乗になることです。このため、ビットコインなどでは様々な場面でダブルハッシュが使用されています。
前述したように、ビットコインでは使われているSHA256とRIPEMD160というハッシュ関数のうち、SHA256を二回適用したハッシュがよく使われています。しかし、より短いハッシュが必要な場合は、一度SHA256を適用したハッシュに、さらにRIPEMD160を適用したハッシュが用いられています。
どんなデータも、一定の長さに変換するハッシュ。限られたデータしか書き込めないブロックチェーンには欠かせない技術です。ハッシュを理解すれば、いろいろなサービスの仕組みの理解が進んだり、新しいブロックチェーンの使い方を検討するときの幅が広がります。ハッシュを理解して、よりブロックチェーンを楽しみましょう。