ブロックチェーンでは取引情報や直前のブロックデータをハッシュ化したりと、ハッシュ関数がとても大切は役割を果たしています。

ハッシュ関数が使われることでブロックに記録された取引情報を固定サイズのハッシュ値にしたり、過去のブロックの改ざんを防ぐことができるのです。

また、ハッシュ関数は性質的に暗号関数と似ていますが、ハッシュ関数の場合は逆算が不可能(復号化できない)などの点で異なる特徴を持っています。

そこで、ここではブロックチェーンを正しく理解するために必要なハッシュ関数についてお伝えしていきます。

 

一方向ハッシュ関数とは

一方向ハッシュ関数とは、一言でいうと「メッセージの指紋をとること」です。一方向ハッシュ関数に「メッセージ」という入力情報を入れることで、ハッシュ値が出力されます。

一方向ハッシュ関数では以下のような特徴があげられます。

  • メッセージが1ビットでも異なればハッシュ値は変わる
  • ハッシュ値からメッセージの逆算はできない
  • メッセージの長さに限らず、ハッシュ値は常に固定サイズ
  • ハッシュ値のサイズは小さい

それぞれ具体的に見ていきましょう。

 

メッセージが1ビットでも異なればハッシュ値は変わる

一方向ハッシュ関数は、「メッセージの指紋をとること」と表現しました。つまり、ハッシュ関数の入力であるメッセージが少しでも変化すると、全く違うハッシュ値が出力されます。

例えば後述するハッシュ関数のひとつであるSHA-256に「sato」「kato」「Sato」を入力すると以下のハッシュ値が得られます。

ハッシュ値

このように1文字でもメッセージが異なると、全く違うハッシュ値が出力されていることが分かります。

ハッシュ関数ではハッシュ衝突を避けることがとても重要です。つまり、異なる入力データに対し同じハッシュ値が出力されることを避けなければならないのです。

 

メッセージの長さに限らず、ハッシュ値は常に固定サイズ

一方向性ハッシュの重要な特徴として任意の長さのメッセージに対して、固定サイズのハッシュ値を出力することがあげられます。こちらも具体例を見ていきましょう。

ハッシュ値

この例では、メッセージの文字数が違うにも関わらずハッシュ値のサイズは同じであることが分かります。

この文字数程度ではデータ量に大きな違いはありませんが、ハードディスクに含まれる1TBのデータをハッシュ関数に通しても同様に256ビット(32バイト)のハッシュ値が得られます。

 

ハッシュ値からメッセージの逆算はできない

ハッシュ

メッセージをハッシュ関数に通すことでハッシュ値は簡単に計算することができます。しかし、逆にハッシュ値から元のメッセージを計算することはできません。

一般的に暗号関数は暗号化と復号化ができるのに対し、ハッシュ関数は一方向にしかデータを変換できないのです。

任意の入力に対して固定サイズの出力であるように設計されていることもメッセージの逆算を困難にしています。

 

ハッシュ値のサイズは小さい

入力情報であるメッセージのサイズはどれだけ大きくても問題ありませんが(ハッシュ関数によって上限はあります)、出力情報のハッシュ値のサイズは扱いやすいように小さくなっています。

ハッシュ関数の種類によってハッシュ値のサイズは異なります。

ハッシュサイズ

このようにサイズが大きなメッセージをハッシュ化することでサイズを小さくできることは、ブロックに記録することができるデータ量が限られていることを考えても大切であると分かります。ちなみに現時点で、ビットコインのブロックサイズは1MBです。

 

安全なハッシュ関数とは

安全なハッシュ関数は少なくとも弱衝突耐性と強衝突耐性という2つの性質を持っている必要があります。

 

弱衝突耐性

弱衝突耐性

安全なハッシュ関数であるためには、あるメッセージのハッシュ値が与えられたときに、そのハッシュ値を持つ別のメッセージを見つけ出すことが非常に困難である必要があります。

この性質のことを弱衝突耐性と呼びます。

上図の例で言えば、blockchainというメッセージをハッシュ関数に入力したときに得られたハッシュ値が、bitcoinのような他のメッセージに逆算できない性質のことです。

現時点では、ビットコインで使われているSHA-2やRIPEMD-160などのハッシュ関数は弱衝突耐性を持っています。

 

強衝突耐性

強衝突耐性

強衝突耐性とは、ハッシュ値が一致するような異なる2つのメッセージを見つけ出すことが非常に困難である性質のことです。

上図の例で言えば、あるハッシュ値を逆算したときにblockchainとbitcoinのように異なる2つのメッセージを見つけ出せないということです。

一般的に強衝突耐性は弱衝突耐性に比べれ破られやすくなっています。

SHA-2やRIPEMD-160は強衝突耐性を持ちますが、MD5, SHA-1, RIPEMDなどの強衝突耐性は破られています。

 

ブロックチェーンで使用されるハッシュ関数

ビットコインのブロックチェーンではSHA-256とRIPEMD-160の2種類のハッシュ関数がさまざまな場面で使用されています。

また、ビットコインではこれら2種類のハッシュ関数を重ねて使うダブルハッシュが使用されています。

つまり、SHA-256のハッシュ値をRIPEMD-160の入力値として使用し、ハッシュ関数を2回通したハッシュ値を使うことで安全性を高めています。

多くの場面でSHA-256のダブルハッシュが用いられ、短いハッシュ値が必要な場合にはSHA-256, RIPEMD-160のダブルハッシュが用いられています。

 

SHA-256とは

SHA-256とはNIST(national institute of standards and technology)で作られた一方向性ハッシュ関数で、256ビットのハッシュ値を出力します。

SHA-256はSHA-2の一種で、ビット長の違いによりSHA-256, SHA-384, SHA-512などが存在します。

ビット長が長ければ長いほどハッシュ衝突を避けることができますが、ビットコインのブロックチェーンでは計算速度や実装のしやすさ、安全性などのバランスを考慮しSHA-256が採用されています。

また、ハッシュ関数にはSHA-2より新しくセキュアであると言われているSHA-3も存在します。このSHA-3はIOTAなどの仮想通貨に使用されています。

 

RIPEMD-160とは

RIPEMD-160はオリジナルのRIPEMDというハッシュ関数を改良したものです。RIPEMDのハッシュ値は128ビット長であるのに対し、RIPEMD-160は160ビット長のハッシュ値を持ちます。

RIPEMDはSHA-2と異なりオープンな学術コミュニティで開発されたので特許による制限はありません。

ただ、オリジナルのRIPEMDの強衝突耐性は破られています。つまり、同じハッシュ値で異なる2つのメッセージを見つけることができているのです。

一方、RIPEMD-160に関しては現時点では破られていないのでセキュアなハッシュ関数であるとされています。

 

一方向ハッシュ関数はブロックチェーンだけに使われているのではなく、デジタル署名やネットバンキングなどで使用されるワンタイムパスワードなどの私たちに身近なところでも利用されている技術です。

また、ハッシュはブロックチェーンを理解するうえでほんの一部分に過ぎませんがブロックチェーンの安全性を高めるうえでとても重要な技術であると言えます。

ただし、ハッシュ関数はデータの正真性をチェックし改ざんを検出することができますが、「なりすまし」を検出することはできません。

「なりすまし」を検出するためにはデジタル署名などの他の技術を必要とします。