【发布时间】:2023-04-10 14:55:01
【问题描述】:
我想在 PHP 中计算大文件的 SHA256。目前,我正在使用 Amazon Glacier 存储旧文件及其 API 来上传档案。最初,我只使用无法达到 MB 大小图像的小文件。当我尝试上传超过 1MB 的内容时,API 响应说我给他们的校验和与他们计算的不同。
这是我上传文件的代码:
//get the sha256 using the file path
$image = //image path;
$sha256 = hash_file("sha256", $image);
$archive = $glacier->uploadArchive([
'accountId' => '',
'body' => "",
'checksum' => $sha256,
'contentSHA256' => $sha256,
'sourceFile' => $image,
'vaultName' => 'my-vault'
]);
还有错误:
AWS HTTP error: Client error: `POST https://glacier.us-west-2.amazonaws.com/vaults/70/archives` resulted in a `400 Bad Request` response:{"code":"InvalidParameterValueException","message":"Checksum mismatch: expected 9f1d4da29b6ec24abde48cb65cc32652ff589467 (truncated...)
我尝试了下面的函数来检查最终的哈希值,但是当我打印它时它似乎不是正确的哈希值:
private function getFinalHash($file)
{
$fp = fopen($file, "r");
$ctx = hash_init('sha256');
while (!feof($fp)) {
$buffer = fgets($fp, 1024);
hash_update($ctx, $buffer);
}
$hash = hash_final($ctx, true); print_r($hash);exit;
fclose($fp);
}
结果哈希是这样的:ŸM¢›nÂJ½äŒ¶\Ã&RÿX”gíÖ'„IoA\C÷× 我认为这里唯一的问题是获取文件的最终哈希值。文件大小为 5.7 MB。
我认为提供校验和的正确方式与提供校验和有关,但我不知道应该如何处理大文件。我真的需要你的帮助。
【问题讨论】:
-
这不是密码学问题。你应该在stackoverflow上问这个。
-
显然,您将校验和作为原始字节发送,而服务希望您将其作为十六进制编码字符串发送。
-
查看 hash_final 中的第二个标志。对于十六进制而不是原始输出,将其设置为 false。 php.net/manual/en/function.hash-final.php
-
只使用
hash_update_stream()而不是while循环怎么样? php.net/manual/en/function.hash-update-stream.php