ゆるテックノート

データ整合性チェック(ハッシュ/署名/チェックサム)

ファイル配布やバックアップ転送で「壊れていない?」「すり替えられていない?」を手早く確かめるためのメモです。

役割の違い

偶発的な破損を検出することと、信頼する配布元のファイルか確かめることを区別します。検証は書き換え自体を防ぐ機能ではなく、受け入れてよいか判断するための機能です。

比較表

手法 できることと条件
SHA-256などのハッシュ 内容を期待値と照合する。期待値も攻撃者に差し替えられるなら配布元の証明にならない。
CRC32などのチェックサム 偶発的な伝送エラーの検出に使う。攻撃者による意図的な変更への対策には使わない。
デジタル署名 信頼する鍵と署名方式で、署名対象の変更と署名者を検証する。鍵や署名者の信頼の確認が必要。

配布・受信時の基本手順

ダウンロードやバックアップ転送で壊れ・改ざんを最小化する手順です。

取得したファイルを照合する

  • 信頼する配布元の正しいドメインで、対象バージョン・OS・ファイル名に対応するSHA-256などの期待値を入手する。HTTPSだけで配布元自体の信頼性が保証されるわけではない。
  • 取得したファイル全体を同じアルゴリズムで計算し、期待値と照合する。不一致なら実行せず、対象ファイルや取得経路を確認する。
  • 配布元が指定する署名検証手順を実施する。公開鍵の指紋や署名者IDなど、方式に応じた信頼の基準も確認する。「署名が有効」だけで期待する配布元だと判断しない。
  • ZIPなどの配布アーカイブは、まずそのアーカイブに対応する期待値で照合する。展開後の各ファイルを検証する場合は、別途信頼できるファイル別一覧と照合する。値を計算するだけでは破損は判定できない。

期待値と検証方法を提供する

  • 少なくともSHA-256のハッシュを公開し、MD5/SHA-1のみの掲載は避ける。
  • 署名を提供する場合は、検証方法と信頼できる鍵の指紋・署名者IDの確認方法も示す。鍵サーバーで見つけた鍵や複数サイトの一致だけで本人の鍵と断定しない。
  • ファイル別・分割別の一覧を提供する場合は、名前・順序・サイズ・アルゴリズムを明確にし、一覧自体も署名などで保護する。各断片のハッシュを並べた値は、ファイル全体のハッシュとは異なる。

ハッシュ選定の目安

セキュリティと性能のバランスを考えます。

選び方

  • 配布物の照合ではSHA-256が広く使われる。配布元と同じアルゴリズム・対象バイト列で比較する。
  • 署名では採用する署名方式・ライブラリ・運用規格に従う。ハッシュの出力長だけでは、鍵の信頼性や署名方式全体の安全性は決まらない。
  • MD5/SHA-1は衝突耐性を必要とする新しい用途に選ばない。互換用に掲載する場合も、SHA-256など安全な照合方式を併せて案内する。

よくある落とし穴

整合性チェックは「値を出すだけ」で終わらない点に注意します。

チェックポイント

  • 攻撃者がファイルと期待値の両方を差し替えられるなら、ハッシュ一致だけでは防げない。信頼できる経路の期待値や、信頼する鍵による署名が必要。
  • 通常のファイル内容のハッシュには、ファイル名・更新日時・権限ビットは含まれない。改行の変更は内容のバイト列を変える。TARなどのアーカイブはメタデータを内部に格納するため、権限や日時の違いがアーカイブ全体のハッシュに影響する場合がある。
  • S3のマルチパートアップロードのETagはファイル全体のMD5ではない。暗号化方式によっても扱いが異なる。専用チェックサムを使う場合も、全体の値かパートからの合成値かを確認して照合する。
  • 署名検証は公開鍵の正当性確認(Web of Trustや鍵ピニング)がセット。鍵がすり替われば無意味。

まとめ

期待値・対象バイト列・アルゴリズムをそろえて照合します。署名は信頼する鍵や署名者の確認と組み合わせます。共有鍵を使うHMACも認証の方法ですが、鍵を持つ全員が生成できるため、公開検証できる電子署名とは役割が異なります。有効な署名も、ソフトウェアが無害であることまでは保証しません。

根拠と関連資料

Python hashlib / Amazon S3 checksums / RFC 2104 / ハッシュの基礎