叡智の三猿

〜森羅万象を情報セキュリティで捉える

当サイトは、アフィリエイト広告を使用しています。

ブロックチェーンとリプレイ攻撃

ビットコインの根幹を支えるのが、ブロックチェーンと呼ばれる技術です。

ブロックチェーンの定義

  • 電子署名とハッシュポインタを使用し改竄検出が容易なデータ構造を持ち、且つ、当該データをネットワーク上に分散する多数のノードに保持させることで、高可用性及びデータ同一性等を実現する技術(一般社団法人日本ブロックチェーン協会による定義)。


ブロックチェーンにより、全ての参加者が自律して取引履歴を記録し続けています。そして、参加者によって監視や承認がされることで安全性を保ちます。

これは自律分散型のシステムの特徴で、P2P(Peer to Peer)ネットワークと呼ばれます。中央サーバーを用意せず個々の端末(Peer)が互いに信頼し合うことで成立するネットワークです。ビットコインは P2P 方式でデータを交換しています。特定の管理者がいないことが、安定した運営につながります。

クライアント・サーバとP2P

誰もが使っているSNSアプリの「LINE」でも、P2P技術が使われています。LINEで写真や動画を共有したことがあると思いますが、このデータを共有する仕組みはP2P技術を利用したものです。

一方、 P2P 方式は、データの整合性を担保するのが難しくなる欠点があります。

この欠点を克服するのが、ハッシュという暗号化技術です。

入力したデータは、ハッシュ関数という関数を通すことで、データ毎に固有な値が生成されます。これをハッシュ値と呼びます。データがちょっとでも改ざんされたら、異なるハッシュ値が生成されます。ですので、ハッシュ値は入力したデータを特定するIDの如く機能するため、データの改ざんがあれば瞬時に検出できます。

ビットコインはSHA-256というハッシュ関数のアルゴリズムを採用しています。世の中に、ハッシュ関数はいくつも存在しますが、政府により安全性が確認された暗号技術で、当該技術の利用を推奨するもののリストを「CRYPTREC暗号リスト」として公開しています。

ハッシュ関数としてCRYPTREC暗号リストに掲載されているのは、以下の3つです(令和4 年4 月30 日更新版での確認)。

  • SHA-256
  • SHA-384
  • SHA-512

わたしはクライアントに電子データの取引に関わる仕事をしていますが、その際、安全なデータを受け渡しするため、ハッシュ関数を日常的に使っています。

Windowsのcertutil コマンドプロンプトを使うことでハッシュ値は簡単に求められます。

>certutil -hashfile (ファイルパス) (ハッシュアルゴリズム)

下図はデスクトップにあるプレゼンテーション11というパワーポイントのファイルをSHA256というハッシュ関数を用いてハッシュ値を求めた例です。

certutilコマンドによるハッシュ値の算出

ちなみにMACでSHAのハッシュ値を求めるコマンドは、shasum -a です。aには256を入れれば、SHA-256の関数が適用されます。

会社間の取引に使うブロックチェーンでは、取引とハッシュ値をひとつのブロックとして管理します。ひとつ前のブロックをハッシュ関数で、要約した値(ハッシュ値)を次のブロックに保持します。

もしある取引に改ざんが行われたら、次のブロックで保持しているハッシュ値と不整合が起きます。これで不正を検出します。

ブロックチェーン

ハッシュ値は、情報システムのパスワードを格納する際もよく使われます。というか、パスワードを平文で管理するシステムは怖くて使いたくありません。

ハッシュ関数は1方向性の関数ですので、パスワードからハッシュ値を計算することはできますが、ハッシュ値からパスワードを計算することはできません。この特徴がパスワードを格納するのに向いてます。

ただ、パスワードのみから計算したハッシュ値を記録するのは、注意が必要です。攻撃者が通信を盗聴して得られたID・パスワードを同じように入力すれば、不正アクセスが可能になるからです。これは「リプレイ攻撃(反射攻撃)」という不正アクセス手法のひとつです。

仮想通貨市場で、リプレイ攻撃に被害にあった有名な事例が、2016年の「The DAO」です。

「The DAO」は独自の仮想通貨DAOトークン(代替貨幣)を発行して、仮想通貨イーサリアム(ETH)を集めていた組織です。イーサリアムは、アルトコイン(ビットコインを除く仮想通貨の総称)の時価総額では1位です(2022年5月時点)。

しかし、短期間に同じトランザクションを大量に出すとすべて承認されてしまうというプログラムの脆弱性がありました。それにリプレイ攻撃を受け、65億円が盗難されました。

リプレイ攻撃対策として、認証サーバー側から送られるランダムな文字列(ナンス値といいます)をパスワードと結合させ、それに対してハッシュ値を取り、クライアントに送る認証方法が使われます。

ナンス値は毎回異なります。そのため、ハッシュ値は今までに使われたことがあるものと異なる値となるので安全なデータ管理が可能です。

ナンス値はハッシュ値と同様にブロックチェーンを支えるセキュリティ技術です。