當前位置: 首頁> 最新文章列表> 使用hash_update_stream() 實現文件簽名驗證

使用hash_update_stream() 實現文件簽名驗證

M66 2025-05-27

在web 開發中,文件傳輸和存儲的安全性一直是一個不可忽視的問題。為了保證文件的完整性和防止文件在傳輸過程中被篡改,文件簽名驗證是一種常見且有效的做法。 hash_update_stream()函數是PHP 中用於處理文件簽名驗證的重要工具之一。本篇文章將介紹如何使用hash_update_stream()函數來實現文件簽名驗證,並確保文件的完整性和安全性。

什麼是文件簽名驗證?

文件簽名驗證是一種使用哈希算法對文件內容生成數字簽名,然後通過該簽名驗證文件的完整性的方法。常見的哈希算法有MD5、SHA-1、SHA-256 等,它們通過生成唯一的文件指紋來幫助驗證文件在傳輸過程中的完整性。

當文件在網絡上傳輸時,可能會遇到各種威脅,如文件篡改、數據丟失等。為了防止這些問題,文件簽名驗證能夠幫助我們確認文件沒有被篡改過,並且其內容是完整的。

hash_update_stream()函數簡介

PHP 中的hash_update_stream()函數用於更新哈希值,這對於處理大文件非常有效,因為它允許逐步更新哈希值,而不需要將整個文件內容一次性加載到內存中。這個函數通常與hash_init()hash_final()函數一起使用,完成文件的簽名生成和驗證過程。

hash_update_stream()函數的基本用法

hash_update_stream()的基本語法如下:

 bool hash_update_stream ( resource $context , resource $handle [, int $length = 1024 ] )
  • $context : 這是由hash_init()函數創建的哈希上下文。

  • $handle : 文件的文件句柄,可以通過fopen()函數獲取。

  • $length : 每次更新哈希值時讀取的字節數,默認為1024 字節。

步驟1: 初始化哈希上下文

首先,我們需要選擇一個哈希算法,並初始化一個哈希上下文。在本例中,我們將使用SHA-256 算法。

 $algorithm = 'sha256';
$context = hash_init($algorithm);

步驟2: 打開文件並逐步更新哈希值

接下來,我們通過fopen()函數打開文件,並使用hash_update_stream()函數逐步讀取文件內容並更新哈希值。這個過程可以處理大文件而不會佔用過多的內存。

 $file = fopen('file.txt', 'rb');
if ($file === false) {
    die('無法打開文件');
}

while (!feof($file)) {
    hash_update_stream($context, $file);
}

fclose($file);

步驟3: 獲取文件的哈希值

一旦文件內容全部讀取並更新到哈希上下文中,我們就可以通過hash_final()函數獲取最終的哈希值。

 $fileHash = hash_final($context);
echo "文件的哈希值是: " . $fileHash;

步驟4: 驗證文件的完整性

為了驗證文件的完整性,我們需要將文件的哈希值與之前存儲的正確哈希值進行比較。如果兩者匹配,則說明文件未被篡改。

 $expectedHash = '預先存儲的哈希值';

if ($fileHash === $expectedHash) {
    echo "文件完整,未被篡改";
} else {
    echo "文件已被篡改";
}

示例:完整的文件簽名驗證代碼

<?php
// 選擇哈希算法
$algorithm = 'sha256';

// 初始化哈希上下文
$context = hash_init($algorithm);

// 打開文件
$file = fopen('file.txt', 'rb');
if ($file === false) {
    die('無法打開文件');
}

// 逐步更新哈希值
while (!feof($file)) {
    hash_update_stream($context, $file);
}
fclose($file);

// 獲取文件的哈希值
$fileHash = hash_final($context);
echo "文件的哈希值是: " . $fileHash . "\n";

// 驗證文件完整性
$expectedHash = '預先存儲的哈希值';

if ($fileHash === $expectedHash) {
    echo "文件完整,未被篡改";
} else {
    echo "文件已被篡改";
}
?>

使用hash_update_stream()的優勢

  1. 內存效率高: hash_update_stream()函數允許逐步讀取文件併計算哈希值,適合處理大文件,避免了一次性加載整個文件的內存消耗。

  2. 支持多種哈希算法: PHP 支持多種哈希算法(如SHA-256、SHA-512 等),可以根據需求選擇合適的算法。

  3. 簡便易用: 使用hash_update_stream()進行文件簽名驗證非常簡單,只需要幾個步驟即可實現完整性驗證。

URL 的安全性

在實際的應用中,文件簽名驗證往往與文件下載和上傳操作結合使用。如果你在使用m66.net這樣的網站進行文件傳輸,確保每次下載的文件經過簽名驗證是一個重要的安全措施。比如,你可以通過以下方式驗證從m66.net下載的文件是否被篡改: