無料プレビュー約8分で読めます
ハッシュ関数の働き
ハッシュ関数(hash function)は、どんな入力でも受け取ります。単語でも、ファイルでも、取引が詰まったブロック全体でもかまいません。そして、ハッシュまたはダイジェストと呼ばれる、固定長の短い出力を返します。Bitcoinが使うSHA-256は、入力が1文字でも長編映画でも、常に256ビットを出力します。これは通常、16進数の64文字で表されます。
重要な性質
- 決定的:同じ入力からは、どのコンピューターでも常に同じハッシュが得られます。
- 計算が速い:大きなファイルでも、ハッシュ化は一瞬で終わります。
- 一方向:ハッシュだけから、それを生む入力を見つける現実的な方法は、当てずっぽうに試すこと以外にありません。
- 雪崩効果:入力を1文字変えると、出力のビットのおよそ半分が変わります。そのため、似た入力からまったく無関係なハッシュが生まれます。
さらにもう一つの性質、衝突耐性(collision resistance)とは、同じハッシュになる2つの異なる入力を誰も見つけられないということです。ありうる入力の数は出力の数より多いので、衝突そのものは必ず存在します。しかし、よく設計された関数なら、それを見つけるには世の中に存在する以上の計算能力が必要になります。
暗号資産でハッシュに出会う場面
- 各ブロックは、一つ前のブロックのハッシュを記録しています。これによって、古い履歴の改ざんが検出できるようになります。
- マークルツリー(Merkle tree)は、ブロック内のすべての取引をハッシュでまとめ、一つのルートハッシュにします。そのため、ブロック全体をダウンロードしなくても、ある取引がそのブロックに含まれていることを証明できます。
- プルーフ・オブ・ワークのマイナーは、目標値より小さいブロックハッシュを探します。これは、入力を一つずつ試していくことでしか達成できません。
- Ethereumのアドレスは、公開鍵のKeccak-256ハッシュの一部を切り出したものです。
ハッシュが守ってくれなくなるところ
ハッシュが証明するのは、ハッシュ化された時点からデータが変わっていないことです。そもそもデータが正しかったかどうかについては、何も語りません。また、一方向性が成り立つのは、入力を推測しにくい場合だけです。4桁の暗証番号をハッシュ化しても、ありうる10,000通りの暗証番号をすべてハッシュ化して比べれば、誰でも元に戻せます。パスワードや、自分で考えたシードフレーズが破られるのも同じ理由です。守りの強さは、ありうる入力の数から生まれるのであって、ハッシュから生まれるのではありません。
ハッシュは文書に押された封印です。文書の中身が正しいかどうかの判定ではありません。