ハッシュ関数の利用

前回の続き。ハッシュ関数と電子署名の関係まで。参考:『暗号技術のすべて』

(復習)
ブロックチェーンの4つの構成要素
1.ピア・ツー・ピア(P2P)ネットワーク
2.コンセンサス・アルゴリズム(PoW、PoS、PDFTなど)
3.電子署名・ハッシュ関数
4.スマートコントラクト

データ改ざんの検出に用いるハッシュ関数

 一方向性や衝突困難性を満たさないハッシュ関数であっても、データの改ざんを防ぐ(データの一致性を調べる)ための道具として十分に活用できる。

 そもそも、データ改ざんを検出するアプローチは2種類ある。1つ目は、安全に保管しておいたデータと現データとを、先頭から1bitずつ(0or1かを)比較していく方法である。64bitのデータは64回、256bitのデータは256回比較することになる。保管したデータがバックアップになるので、これをデータの復元に使うことができるところは利点だが、データの容量が大きくなると時間がかかりすぎるという欠点がある。

 2つ目は、データそのものではなくデータの特徴値を保管しておいて、それと現データの特徴値とを比較する方法である。ハッシュ関数はこちらの方法で使われる技術だ。特徴値が一致していれば改ざんされた確率が低く、一致しなければ改ざんされた確率が高くなる。データそのものではなく特徴値を比較するので、「改ざんがあった確率がかなり低い」とは言えても「改ざんされていない」とは言えない。通常、特徴値は目視で確認できる程度の長さの固定長のデータであり、計算機への負荷は少ない。

特徴値の取り方

データ変化の要因がノイズの場合

 データの変化の要因がノイズであれば、ビット反転の位置はランダムになるので、チェックサムなどの比較的単純な技術で検出と補正ができる。ビット反転とは、「001001」のような配列のデータが「001001」のようになって、0と1が置き換わった状態である。この例では、2bit目(赤字)と5bit目(青字)でビット反転が発生している。

チェックサムとは、誤り検出符号の一つで、データ列を整数値の列とみなして和を求め、これをある定数で割った余り(余剰)を検査用データとするもの。最も単純な誤り検出方式の一種で、誤りの検出精度は低いが原理が簡単で容易に実装でき、計算コストも低いため、簡易な誤り検出方式として広く普及している。
チェックサムを用いるとデータの伝送や記録、複製が正確に行われたかをある精度で調べることができる。送信や記録の前にチェックサムを算出して元データに付加し、受信や読み出しの後に同じ個所のチェックサムを算出しなおしてみて、両者が一致しなければ、その区間に含まれるデータのいずれかに誤りが生じていることが分かる。チェックサムは誤りの検出のみ可能であり、訂正はできない。
例えば、4バイトのデータ列「0xC0 0xA8 0xFF 0x58」(16進数表記)から1バイトのチェックサムを算出するには、C0+A8+FF+58を計算して和(0x2BF)を求め、これを0x100で割った余り(最下位バイト)の0xBFがチェックサムとなる。データ列が長い場合は一定の大きさごとに区切ってチェックサムを算出・付加することが多い。その際の区切りの長さやチェックサム自体の長さは用途や実装により異なる。

IT用語辞典 eーWords

データ変化の要因が意図的な改ざんの場合

 データ変化の要因が意図的な改ざんである場合は、ハッシュ関数の出番となる。データが改ざんされていれば、保存したハッシュ値と現データのハッシュ値が一致することはほとんどない。

(復習)ハッシュ関数の特徴
①任意長のデータから固定長のハッシュ値を生成できる
②生成したハッシュ値は短く目視で確認できる程度なので、比較する際の計算負荷が少ない
③2つの異なるデータから生成したハッシュ値が一致する(衝突する)可能性は低い。

課題:データ(ハッシュ値)の保管方法

 保管しておいたハッシュ値が改ざんされては困るので、ハッシュ値と比較対象のデータとを同じ場所においてはいけない。

ローカルプログラムの場合

 プログラムのハッシュ値はUSBフラッシュメモリなどの外部記憶媒体に保管し、コンピュータから物理的に隔離しておく。

ネットワークを介したプログラムの場合

 ネットワークを介して送信する場合、データ・ハッシュ値のいずれも盗聴・改ざんを受ける恐れがある(「鍵配送」などが問題となるが、これについては公開鍵暗号の記事で書いたので割愛)。これを解決するためには、デジタル署名やメッセージ認証コードを用いる必要がある。逆に言えば、 デジタル署名やメッセージ認証コード の構成要素として、ハッシュ値が組み込まれている。