別データのハッシュが同じになることは本当にないの?|DApps(ブロックチェーンを活用したアプリケーション)のことなら

TOP  コラム  別データのハッシュが同じになることは本当にないの?

別データのハッシュが同じになることは本当にないの?

2018.10.24

コラム

別データのハッシュが同じになることは本当にないの?

 

ハッシュ関数の不思議と安全性

ブロックチェーン技術では、その基礎となるブロック生成や正しい連結の承認、改ざん検出を容易にして高い耐改ざん性を発揮する点など、きわめて重要な部分に暗号技術のハッシュ関数が用いられ、機能するところとなっています。

ブロックチェーン以外にも、パスワードの保管・管理や、Webブラウザとサーバー間でのSSL(Secure Socket Layer)暗号化通信における電子証明書など、ハッシュ関数は私たちの身近なサービスや仕組みを支え、さまざまなシーンで活躍しているものといえます。

このハッシュ関数は、多様なかたちや長さの入力情報から、ある一定の桁数、固定長からなるビット列を出力する特別な関数で、入力データからの計算は容易ですが、出力結果のハッシュ値から関数アルゴリズムや入力データの逆算、推定はおよそ不可能な一方向性をもっています。

また、同一の入力情報から生成されるハッシュ値は常に同一であり、入力情報が少しでも変化すれば、ハッシュ値は大幅に異なるものとなること、異なる入力データから同じハッシュ値が偶然に生成されることはほぼあり得ないことも大きなポイントで、これらの特性を有するからこそ、活用できるものとなっています。

しかし、こうした特性は本当に必ず維持されるのでしょうか。万が一ということはあり得ないのか、考えてみましょう。

完全ではないが“ほぼ”不可能

ハッシュ関数にかけて得られるハッシュ値は、そもそも元データに比べると小さなデータであり、常に決まった桁数の不規則な数列で表現されるものです。より小さい固定長のビット列である限り、原理上、表現可能なパターンはもとよりも減少するわけですから、膨大な処理が行われる中では、どこかで2つの異なる元データでも、同じハッシュ値になってしまうことが起こり得るように思われますね。

実はその通りで、ハッシュ関数の説明でも、一般に「ほとんどあり得ない」「基本的にない」といった表現が用いられており、そこには100%ではないこと、絶対に同じにならないとはいえないという含みがあるのです。

入力される元データが情報として異なるにもかかわらず、生成されたハッシュ値が偶然に同じとなることは、理論的にはあり得ることで、そうした状態が生じることを「衝突」といいます。

いうまでもありませんが、このハッシュの衝突はきわめて望ましくないことであり、その可能性はできる限り低いものでなくてはなりません。ハッシュ関数と認められて採用される関数の場合、こうした衝突が発生する確率は、ごくごく低い天文学的な数字を要するものとなっているため、およそ懸念する必要のない問題と扱えるようになっています。

攻撃で衝突を起こさせることも非常に困難

偶然に衝突が起こる可能性はきわめて低いとして、悪意のある攻撃者が故意に生じさせることはあり得ないでしょうか。もし発生確率を大幅に上昇させられたり、何らかの操作で狙ったところに衝突を起こさせたりできるとなれば、ハッシュ関数が支える仕組み全体に深刻な影響を与えてしまいます。

ハッシュ関数のSHA-1を例に考えてみましょう。SHA-1のビット数は160なので、総当たり攻撃で同じハッシュ値を見つけるには、2の160乗回試行計算が必要です。「誕生日が同じ人が2人以上いる確率が過半となるには23人の人がいればよい」という有名な誕生日パラドックスの理論に基づく誕生日攻撃でも、ハッシュ値が同じ2つの入力情報を見つけ出すには、2の80乗回試行しなければなりません。

SHA-1の場合、2005年に発見された特殊な攻撃方法で、2の69乗回試行することにより、衝突を生じさせられる可能性が指摘されていますが、2つのデータに一定の関係性をもたせる必要があるなど、そのハードルは依然高いものがあります。

仮に世界の全人口にあたる約70億人が、1人あたり25億個超のファイルを保有し、それぞれのハッシュ値をとったとしても、ハッシュ値の合計数は2の60乗台で事足りるため、こうした試算からも衝突の可能性や、衝突を狙う攻撃の難しさが推察されるでしょう。

こうしたSHA-1でも、欠点とリスクが取り沙汰されるようになり、現在はさらにビット数が長く、より衝突も起こりにくい、複雑で高い安全性を確保したSHA-2規格のハッシュ関数が推奨されてスタンダードとなっていますから、ほぼリスクは回避されていると考えられます。

いかがでしたか。数列として処理する以上、絶対に衝突のないハッシュ関数はあり得ません。しかしその可能性を極限にまで下げ、衝突させるには天文学的な時間や計算処理を必要とするようなものとして安全性を確保しているため、運用上は心配のないものとなっています。だからこそ、ハッシュ関数には十分な実用性が認められているのですね。

(画像は写真素材 足成より)

DApps総研 https://dapps-info.com/