首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

Python 實現文件快照加密保護:基於 SHA-1 的完整性校驗

     編輯:更多程式設計知識

文件完整性監控是資安防禦的基石。本文介紹如何用 Python 編寫一個輕量級工具,掃描指定目錄(含子目錄)下特定副檔名的文件,計算其 SHA-1 雜湊值並輸出為 CSV 格式,便於後續比對發現竄改。

核心功能

  • 遞歸遍歷目標目錄
  • 按副檔名過濾(如 .exe, .dll, .ini 等系統關鍵文件)
  • 分塊讀取文件計算 SHA-1,避免大文件記憶體溢出
  • 輸出 CSV:文件路徑、大小、雜湊值
  • 支援標準輸出重導向,易於腳本整合

完整代碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Snapper 1.2 - 文件完整性快照工具
用法: python snapper.py > snapshot.csv
作者: Sebastien SAUVAGE (改良版)
"""
import os
import sys
import hashlib
import stat

# 掃描根目錄與關注副檔名(可根據需求修改)
SCAN_ROOT = r'C:\Windows'
EXTENSIONS = {
    '.exe', '.dll', '.ini', '.ocx', '.cpl', '.vxd', '.drv',
    '.vbx', '.com', '.bat', '.src', '.sys', '.386', '.acm',
    '.ax', '.bpl', '.bin', '.cab', '.olb', '.mpd', '.pdr', '.jar'
}

def file_sha1(filepath: str) -> str:
    """分塊計算文件 SHA-1,返回十六進制字串"""
    sha1 = hashlib.sha1()
    with open(filepath, 'rb') as f:
        for chunk in iter(lambda: f.read(65536), b''):
            sha1.update(chunk)
    return sha1.hexdigest()

def scan_directory(root: str, extensions: set) -> list:
    """遞歸掃描,返回 (路徑, 大小, SHA1) 元組列表"""
    results = []
    for dirpath, _, filenames in os.walk(root):
        sys.stderr.write(f'Scanning {dirpath}\n')
        for fname in filenames:
            ext = os.path.splitext(fname)[1].lower()
            if ext in extensions:
                full = os.path.join(dirpath, fname)
                try:
                    size = os.stat(full).st_size
                    digest = file_sha1(full)
                    results.append((full, size, digest))
                except (OSError, IOError) as e:
                    sys.stderr.write(f'  無法讀取 {full}: {e}\n')
    return results

def main():
    sys.stderr.write('Snapper 1.2 - 文件完整性快照\n')
    data = scan_directory(SCAN_ROOT, EXTENSIONS)
    sys.stderr.write('排序中...\n')
    data.sort(key=lambda x: x[0])  # 按路徑排序
    # 輸出 CSV 標題
    print('"File path","File size","SHA1"')
    for path, size, sha1 in data:
        # 轉義雙引號
        safe_path = path.replace('"', '""')
        print(f'"{safe_path}",{size},"{sha1}"')
    sys.stderr.write('完成。\n')

if __name__ == '__main__':
    main()

使用指南

  1. 將代碼存為 snapper.py。
  2. 修改 SCAN_ROOT 和 EXTENSIONS 適配環境。
  3. 運行:python snapper.py > baseline.csv 生成基線快照。
  4. 定期重跑並用 diff 或 Excel 比對,異常條目即為可疑變更。

進階建議

  • 改用 SHA-256(將 hashlib.sha1() 換為 hashlib.sha256())提升抗碰撞強度。
  • 加入 mtime(修改時間)欄位,快速過濾未變文件。
  • 結合 watchdog 庫實現實時監控而非定期掃描。
  • 將基線簽名(如 GPG 簽名)離線保存,防止基線本身被竄改。

這個腳本雖簡單,卻是構建主機入侵檢測系統 (HIDS) 的核心組件之一。靈活運用,守護系統完整性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved