
ファイルの改ざん検知をPythonで実装|ハッシュで"変わっていないか"を確かめる
2026-09-18 ・ 実践
配布ファイルがすり替えられていないか、重要な設定ファイルが勝手に書き換えられていないか——それを確かめるのが ハッシュによる改ざん検知 です。この記事ではSHA-256を使い、ファイルの「指紋」で変化を見張る仕組みをPythonで実装します。
ハッシュ=ファイルの指紋
ハッシュ関数はファイルの中身から固定長の値を計算します。1バイトでも変わればハッシュは激変(雪崩効果)。だからハッシュを比べるだけで改ざんがわかります。
なぜ比較に便利か
ファイル全体を保存・比較しなくても、64文字のハッシュ値さえ控えておけば「変わったか」が判定できます。配布サイトが公開する「SHA-256チェックサム」はこの用途です。
準備
標準ライブラリのhashlib・osだけ。
① ファイルのハッシュを計算
大きなファイルでもメモリを食わないよう、少しずつ読み込みます。
import hashlib
def file_hash(path):
h = hashlib.sha256()
with open(path, "rb") as f:
for chunk in iter(lambda: f.read(8192), b""):
h.update(chunk)
return h.hexdigest()
# テスト用ファイルを作って確認
with open("sample.txt", "w") as f:
f.write("重要な設定: port=443")
print("ハッシュ:", file_hash("sample.txt"))
② 改ざんを検知する
正しいハッシュを控えておき、後で照合します。
import hmac
known_good = file_hash("sample.txt") # 正常時のハッシュを保存
# …あとで誰かが書き換えたとする
with open("sample.txt", "w") as f:
f.write("重要な設定: port=8080") # ← 改ざん
current = file_hash("sample.txt")
if hmac.compare_digest(known_good, current):
print("OK: 変更なし")
else:
print("⚠️ 改ざん検知: ファイルが変わっています")
出力は ⚠️ 改ざん検知。中身が変わればハッシュが一致せず、すぐに気づけます。
③ ディレクトリを見張る
複数ファイルのハッシュ台帳を作り、変化したファイルを洗い出します。
import os
def snapshot(folder):
return {f: file_hash(os.path.join(folder, f))
for f in os.listdir(folder)
if os.path.isfile(os.path.join(folder, f))}
before = snapshot(".")
# …時間が経過…
after = snapshot(".")
changed = [f for f in after if before.get(f) != after[f]]
print("変化したファイル:", changed)
ハッシュ台帳は安全な場所に
台帳(正しいハッシュ)を、監視対象と同じ場所に平文で置くと、攻撃者に一緒に書き換えられます。台帳は別の安全な場所に保管し、可能なら署名して守ります。配布物の検証では、公式サイトのHTTPS経由でハッシュを入手するのが基本です。
まとめ
- ハッシュ(SHA-256)はファイルの指紋。1バイトの変化で激変する
- 正しいハッシュを控えておき、後で照合すれば改ざんがわかる
- 比較は
hmac.compare_digestで安全に - ディレクトリのハッシュ台帳で変化ファイルを検出できる
もう少し詳しく(背景と理論)
ファイル完全性の検証は、暗号学的ハッシュ関数(現在は SHA-256 が標準)で「指紋」を取り、前後で一致するかを比べる仕組みです。1バイトでも変われば全く違うハッシュになる雪崩効果が基礎になります1。ここで重要なのは、MD5 と SHA-1 は衝突攻撃が実証されて破られていること——異なる2つのファイルを同じハッシュにできるため、改ざん検知には使ってはいけません2。さらに、単なるハッシュは攻撃者がファイルと一緒にハッシュも書き換えられるため、鍵付きの HMAC や署名で「正規の発行者が作った」ことまで保証するのが堅実です3。
次の一歩 🌸
署名で守るならRSA署名、ハッシュの応用のパスワードハッシュ、更新管理のアップデートとパッチへどうぞ。