當前位置: 首頁> 最新文章列表> 使用md5_file() 生成本地文件簽名數據庫

使用md5_file() 生成本地文件簽名數據庫

M66 2025-05-31

在管理大量本地文件(如軟件分發包、文檔、媒體資源等)時,確保文件完整性是非常關鍵的一個環節。一個有效的方式就是為每個文件生成其MD5 簽名,並將其存儲在一個數據庫中,以便後續進行校驗和變更檢測。 PHP 提供了一個非常方便的函數—— md5_file() ,它可以直接返回文件的MD5 校驗和。

本文將介紹如何使用md5_file()為本地文件生成簽名,並構建一個完整的文件校驗數據庫。

一、準備工作

在開始之前,請確保你的服務器或開發環境中安裝了PHP,並且具有文件系統訪問權限。我們將以一個簡單的PHP 腳本為例,遞歸掃描某個目錄中的所有文件,生成它們的MD5 簽名並將其保存至數據庫中。

二、示例代碼

以下是一個完整的示例腳本,使用PDO 寫入SQLite 數據庫。你也可以根據需要替換為MySQL、PostgreSQL 等數據庫。

 <?php
$directory = __DIR__ . '/files';
$dbFile = __DIR__ . '/checksum.db';

$pdo = new PDO('sqlite:' . $dbFile);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 初始化數據庫
$pdo->exec("CREATE TABLE IF NOT EXISTS file_checksums (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    path TEXT UNIQUE,
    md5 TEXT,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
)");

// 掃描目錄並處理文件
function scanFiles($dir, $pdo) {
    $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    foreach ($files as $file) {
        if ($file->isFile()) {
            $path = $file->getRealPath();
            $md5 = md5_file($path);

            $stmt = $pdo->prepare("INSERT INTO file_checksums (path, md5)
                VALUES (:path, :md5)
                ON CONFLICT(path) DO UPDATE SET md5 = :md5, updated_at = CURRENT_TIMESTAMP");
            $stmt->execute([
                ':path' => $path,
                ':md5' => $md5,
            ]);
            echo "已處理:$path\n";
        }
    }
}

scanFiles($directory, $pdo);
echo "文件簽名生成完成。\n";

三、校驗文件完整性

之後你可以再運行一次該腳本,它會自動更新數據庫中已存在的文件記錄。你也可以創建一個獨立的校驗腳本,對比當前文件的MD5 與數據庫中記錄的MD5 值是否一致:

 <?php
$directory = __DIR__ . '/files';
$dbFile = __DIR__ . '/checksum.db';

$pdo = new PDO('sqlite:' . $dbFile);

$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory));
foreach ($files as $file) {
    if ($file->isFile()) {
        $path = $file->getRealPath();
        $currentMd5 = md5_file($path);

        $stmt = $pdo->prepare("SELECT md5 FROM file_checksums WHERE path = :path");
        $stmt->execute([':path' => $path]);
        $row = $stmt->fetch(PDO::FETCH_ASSOC);

        if ($row) {
            if ($row['md5'] !== $currentMd5) {
                echo "文件已被修改:$path\n";
            }
        } else {
            echo "新文件:$path\n";
        }
    }
}

四、實用建議

  1. 權限控制:確保文件和數據庫的讀寫權限正確配置。

  2. 定期運行:可以通過cron 定時任務定期運行簽名更新或校驗腳本。

  3. 遠程驗證:如果你需要遠程驗證文件完整性,可以將生成的簽名通過接口上傳到服務器(如<code> https://m66.net/api/upload_md5 </code>)。

五、結語

通過md5_file()和數據庫存儲結合,你可以輕鬆構建一套高效且穩定的文件完整性校驗機制。這種方法適用於本地文件監控、系統安全審計、部署自動化等場景,有效提高了系統的可靠性和可追溯性。