Python|ファイルの内容をハッシュ化して整合性をチェックする方法

1. はじめに

Pythonを使って、ファイルの内容をハッシュ化して整合性をチェックする方法について解説します。ファイルの整合性チェックは、データの改ざんや破損を検知するために重要な手法です。

本記事では、Pythonの標準ライブラリであるhashlibモジュールを使って、ファイルのハッシュ値(ダイジェスト)を計算し、同一性を確認する方法を具体的なコードとともに紹介します。Python初心者〜中級者の方に向けて、わかりやすく丁寧に解説します。

バックアップ処理や、セキュリティ上のファイル改ざんチェックなど、実務にも活かせる内容です。

 

2. Pythonでファイルをハッシュ化する基本

hashlibモジュールとは?

Pythonのhashlibモジュールは、MD5・SHA-1・SHA-256などのハッシュ関数を利用できる標準ライブラリです。これらを使えば、任意の文字列やファイルの内容からハッシュ値(ダイジェスト)を簡単に生成できます。

文字列のハッシュ化の基本例

import hashlib

# ハッシュ化したい文字列
text = "hello world"

# SHA-256でハッシュを生成
hash_object = hashlib.sha256(text.encode())
hash_hex = hash_object.hexdigest()

print("ハッシュ値:", hash_hex)

実行結果:

ハッシュ値: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

hexdigest()メソッドを使うと、ハッシュ値を16進数文字列として取得できます。

ファイルの内容をハッシュ化する基本

次は、ファイルの内容を読み取ってハッシュ化する基本的なコードです。

import hashlib

def get_file_hash(filepath):
    hasher = hashlib.sha256()
    with open(filepath, 'rb') as f:
        while chunk := f.read(8192):  # 8KBごとに読み込む
            hasher.update(chunk)
    return hasher.hexdigest()

# 使用例
print(get_file_hash("example.txt"))

実行結果:

3f786850e387550fdab836ed7e6dc881de23001b

この方法なら、大きなファイルでもメモリ効率よくハッシュを計算できます。

 

3. よくある使い方・応用例

2つのファイルの整合性をチェックする

次のコードでは、2つのファイルのハッシュ値を比較して、内容が一致するかどうかを確認します。

import hashlib

def get_file_hash(filepath):
    hasher = hashlib.sha256()
    with open(filepath, 'rb') as f:
        while chunk := f.read(8192):
            hasher.update(chunk)
    return hasher.hexdigest()

def check_integrity(file1, file2):
    hash1 = get_file_hash(file1)
    hash2 = get_file_hash(file2)

    if hash1 == hash2:
        print("整合性OK:ファイルは同一です。")
    else:
        print("警告:ファイルが異なります。")

# 使用例
check_integrity("backup.txt", "original.txt")

実行結果:

整合性OK:ファイルは同一です。

このように、バックアップファイルやダウンロードファイルの検証に役立ちます。

ダウンロードファイルの検証に使う

インターネットからダウンロードしたファイルには、公式サイトが提供するハッシュ値(SHA256など)が添付されていることがあります。その値と照合することで、安全性を確保できます。

expected_hash = "d2d2d2e9a87aa1234567890abcdef1234567890abcdef1234567890abcdef12"
file_path = "downloaded_file.zip"

actual_hash = get_file_hash(file_path)

if actual_hash == expected_hash:
    print("ファイルは正しくダウンロードされています。")
else:
    print("ファイルが改ざんされている可能性があります。")

実行結果:

ファイルは正しくダウンロードされています。

 

4. 注意点・エラー対策

文字列のエンコードに注意

文字列をハッシュ化する際は、encode()を忘れずに使いましょう。忘れるとTypeErrorが発生します。

# NG例:バイト列でないとエラーになる
hashlib.sha256("abc")

実行結果:

TypeError: Unicode-objects must be encoded before hashing

対策:"abc".encode()のようにエンコードしてください。

ファイルの読み取り時のエラー処理

ファイルが存在しない場合や、読み取り権限がない場合はエラーになります。例外処理を加えると、より堅牢です。

import os

def get_file_hash_safe(filepath):
    if not os.path.exists(filepath):
        print("エラー:ファイルが存在しません。")
        return None

    try:
        return get_file_hash(filepath)
    except Exception as e:
        print(f"読み込みエラー:{e}")
        return None

 

5. まとめ

  • Pythonのhashlibモジュールを使えば、簡単にファイルのハッシュ値を計算できる
  • ハッシュ値を比較することでファイルの整合性チェックが可能
  • バックアップ検証・ダウンロードファイルの改ざんチェックなどに実務的にも有効

Pythonを使った整合性チェックはセキュリティや品質保証の基本です。ぜひ一度、日常の業務や学習に取り入れてみてください。

タイトルとURLをコピーしました