PHP에서는 파일의 무결성을 보장하기 위해 hash_update_stream을 통해 큰 파일의 해시 값을 계산할 수 있습니다. 데이터베이스 레코드 파일 해싱과 결합하여 파일의 무결성을 확인하여 파일이 변조되지 않았는지 확인할 때 파일의 해시 값을 빠르게 비교할 수 있습니다. 이 기사는이 프로세스를 구현하는 방법을 자세히 설명합니다.
hash_update_stream 함수는 파일 스트림에서 해시 값을 계산하는 데 사용됩니다. 한 번에 파일을 메모리에로드하는 방법과 비교하여 스트리밍 처리를 사용하면 메모리를 효과적으로 저장할 수 있으며 이는 큰 파일을 처리하는 데 특히 적합합니다.
bool hash_update_stream ( resource $context , resource $handle [, int $length ] )
$ 컨텍스트 : Hash_Init () 에 의해 초기화 된 해시 컨텍스트.
$ 핸들 : 유효한 파일 핸들.
$ length (선택 사항) : 한 번에 읽는 바이트 수는 기본값은 8192 바이트입니다.
이 함수는 일반적으로 Hash_Init () 및 Hash_final () 과 함께 사용되며 최종 계산 된 해시 값을 반환하는 데 사용됩니다.
hash_update_stream을 사용하면 파일의 해시 계산 결과를 데이터베이스로 스트리밍 할 수 있습니다. 확인할 때 파일의 해시 값을 다시 계산하고 파일 무결성 확인을 달성하기 위해 데이터베이스에 저장된 값과 비교하면됩니다.
전체 프로세스를위한 간단한 단계는 다음과 같습니다.
파일을 업로드 할 때 파일의 해시 값이 계산되고 데이터베이스에 저장됩니다.
파일을 확인할 때 해시는 데이터베이스에서 읽히고 새로 계산 된 해시와 비교됩니다.
두 일치하는 경우 파일이 변조되지 않았 음을 의미합니다. 그렇지 않으면 파일의 무결성에 의문이 제기됩니다.
먼저 파일 정보와 해시 값을 기록하기 위해 간단한 데이터베이스 테이블을 설계하십시오. 데이터베이스에 이미 파일 테이블이 있다고 가정합니다. 구조는 다음과 같습니다.
CREATE TABLE `files` (
`id` INT AUTO_INCREMENT PRIMARY KEY,
`filename` VARCHAR(255) NOT NULL,
`hash` CHAR(64) NOT NULL,
`uploaded_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
파일 이름은 파일 이름을 저장하고 해시는 파일의 해시 값을 저장하고 업로드 시간을 기록합니다.
사용자가 파일을 업로드하면 파일 스트림을 Hash_update_stream 으로 전달하여 파일의 해시 값을 계산하고 파일 이름과 해시 값을 데이터베이스에 저장합니다.
<?php
// 파일 업로드 처리를 가정합니다
if (isset($_FILES['file'])) {
// 파일 업로드에 대한 정보를 얻으십시오
$fileTmpPath = $_FILES['file']['tmp_name'];
$fileName = $_FILES['file']['name'];
// 해시 계산 초기화
$hashContext = hash_init('sha256');
// 파일 스트림을 엽니 다
$fileHandle = fopen($fileTmpPath, 'rb');
// 해시 값을 계산합니다
while (!feof($fileHandle)) {
// 해시 업데이트
hash_update_stream($hashContext, $fileHandle);
}
// 최종 해시 값을 얻으십시오
$fileHash = hash_final($hashContext);
// 해시 값을 데이터베이스에 저장하십시오
$db = new mysqli('localhost', 'root', '', 'file_db');
$stmt = $db->prepare("INSERT INTO files (filename, hash) VALUES (?, ?)");
$stmt->bind_param("ss", $fileName, $fileHash);
$stmt->execute();
// 파일 핸들을 닫습니다
fclose($fileHandle);
}
?>
이 예에서는 Hash_Init ()를 사용하여 SHA-256의 해시 컨텍스트를 초기화 한 다음 Hash_update_stream ()을 사용하여 업로드 된 파일의 해시 값을 계산하고 Hash_Final ()을 사용하여 해시 값을 얻고 데이터베이스에 저장합니다.
후속 확인 프로세스에서 파일 이름에 따라 데이터베이스에서 해당 해시 값을 얻고 현재 파일의 해시 값과 비교할 수 있습니다.
<?php
// 파일 확인 처리를 가정합니다
$fileNameToVerify = 'example_file.txt'; // 파일 이름을 확인해야한다고 가정하십시오
$filePath = '/path/to/files/' . $fileNameToVerify;
// 데이터베이스에서 해시 값을 얻으십시오
$db = new mysqli('localhost', 'root', '', 'file_db');
$stmt = $db->prepare("SELECT hash FROM files WHERE filename = ?");
$stmt->bind_param("s", $fileNameToVerify);
$stmt->execute();
$result = $stmt->get_result();
$row = $result->fetch_assoc();
$storedHash = $row['hash'];
// 현재 파일의 해시 값을 계산하십시오
$hashContext = hash_init('sha256');
$fileHandle = fopen($filePath, 'rb');
while (!feof($fileHandle)) {
hash_update_stream($hashContext, $fileHandle);
}
$currentHash = hash_final($hashContext);
fclose($fileHandle);
// 데이터베이스의 해시 값과 현재 계산 된 해시 값 비교
if ($currentHash === $storedHash) {
echo "파일 무결성 확인이 통과되었습니다!";
} else {
echo "파일 무결성 확인에 실패했습니다!";
}
?>
확인 중에 먼저 데이터베이스에서 파일의 해시 값을 얻은 다음 파일의 해시 값을 다시 계산 한 다음 결국 비교합니다. 두 해시가 동일하면 파일이 수정되지 않았 음을 의미합니다. 일관성이 없다면 파일이 변조되었을 수 있습니다.
hash_update_stream 과 데이터베이스 로깅 파일 해시 값을 결합하여 파일 무결성을 효율적으로 확인할 수 있습니다. 파일을 업로드하든 후속 확인에 관계없이 스트리밍 해력 계산은 메모리 사용량을 효과적으로 줄일 수 있으며 데이터베이스의 해시 레코드는 후속 검증을위한 안정적인 데이터 지원을 제공합니다.