ハッシュを理解する

ハッシュはデータから短い値を計算する仕組みです。内容の比較や認証の構成要素として使われますが、暗号化のように元へ戻すためのものではありません。値が一致する意味と、出所を信頼する根拠を分けて考えます。

この単元で学ぶこと

  • ハッシュの決定性・出力長・衝突を説明する
  • 信頼できる基準値でファイルを照合する
  • 裸のハッシュとHMACの違いを説明する
  • HMACの機密性と作成者証明の限界を判断する

本文解説

値の計算と決定性 同じバイト列へ同じハッシュアルゴリズムを適用すると、同じ値になります。入力に時刻や乱数を加えなければ、計算した日時や人が変わっても結果は変わりません。ファイル内容を比較する場合は名前ではなく、定めた内容のバイト列を対象にします。

固定長の例 SHA-256は入力の長さによらず256ビットの値を返します。1バイトは8ビットなので32バイト、16進1桁は4ビットなので64桁です。短い文字列も大きなファイルもこの出力長となり、元のデータ全体を可逆に保存しているわけではありません。

一方向性と候補の照合 暗号学的ハッシュでは、与えられた値に一致する入力を求めることが計算上難しい性質などを求めます。しかし候補が少なければ、一つずつ計算して比較できます。「復号できない」と「短いパスワードも絶対推測できない」は同じ意味ではありません。

衝突と耐性 異なる入力が同じ値になることを衝突といいます。固定長の出力より多くの入力を扱えば衝突は存在し得ます。実用の安全性では、衝突する組や特定の値に合う入力を現実的な時間で探しにくいことが重要です。表示を16進から2進へ変えても衝突は消えません。

ファイルの照合 信頼できる経路で取得した期待値と、受け取ったファイルの値を比べます。不一致ならバイト列は同一ではありません。一致は算法の安全性の下で同一性を確かめる材料ですが、文書の記載内容が真実であることまでは証明しません。

裸のハッシュの限界 秘密を使わないハッシュは誰でも計算できます。攻撃者がファイルと基準値の両方を書き換えれば、整合した値を提示できます。出所の信頼を得るには、基準値の保護、信頼する相手の署名、共有秘密を使う認証など別の仕組みが必要です。

HMACによるメッセージ認証 HMACはハッシュ関数と共有する秘密鍵を使って認証用の値を作ります。受信側も同じ鍵とメッセージで検証し、鍵を知らない相手の偽造を難しくします。ただし本文を隠す機能ではなく、鍵を持つ受信側自身も有効な値を作れるため公開鍵署名と同じ作成者証明にはなりません。

パスワードへの応用 パスワードは平文をそのまま保存せず、用途に適した方式で検証用の値を保存します。ソルトは異なる値を入力へ含め、同じ秘密の保存値が単純にそろうのを防ぎます。ソルトだけで十分とせず、推測への計算コストを確保したパスワード用の方式と運用を使います。

図解

ハッシュから認証へ
ハッシュ、HMAC、暗号化、署名は目的と保証範囲が異なる。

重要ポイント

  • SHA-256は256ビット=32バイト=16進64桁。
  • ハッシュは通常、元へ戻すための処理ではない。
  • 衝突の存在と発見の困難さを区別する。
  • 期待値の信頼がなければ出所を確認できない。
  • HMACだけでは本文の秘匿や送信者だけの作成証明にならない。

間違えやすい点

  • ハッシュ値の一致を内容の真実性と混同しない。
  • 先頭数桁だけの照合へ省略しない。
  • 高速ハッシュ一回でパスワード保存が完成したとしない。

用語解説

ハッシュ値
入力データへハッシュ関数を適用した結果の値。
衝突
異なる入力が同じハッシュ値を持つこと。
HMAC
ハッシュ関数と共有秘密鍵を使って、メッセージの認証用の値を計算する方式。
ソルト
パスワード等の検証用計算へ加える値。同じ秘密でも入力を異ならせるため等に用い、復号鍵ではない。

関連教材

参考資料

教材データに登録された参考リンクです。リンク先の内容や更新日は提供元でご確認ください。

確認問題の出題・採点や学習履歴の保存にはログインが必要です。