PHP Conference Japan 2024

Imagick::getImageSignature

(PECL imagick 2, PECL imagick 3)

Imagick::getImageSignature生成 SHA-256 消息摘要

描述

public Imagick::getImageSignature(): string

为图像像素流生成 SHA-256 消息摘要。

参数

此函数没有参数。

返回值

返回包含文件 SHA-256 哈希值的字符串。

错误/异常

错误时抛出 ImagickException。

添加笔记

用户贡献笔记 4 条笔记

barrerasalom at gmail dot com
11 年前
请注意,即使使用相同的图像,不同版本的 ImageMagick 也可能创建不同的签名。
vojtech at kral dot hk
11 年前
此函数返回的 SHA-2 摘要与您对文件进行哈希处理时获得的结果不同,因为此函数对像素本身进行哈希处理。

当您需要识别相同的图像时,这非常有用,因为如果您只是对文件进行哈希处理,即使图像在像素级别相同,您也可能会获得不同的哈希值,这是因为元数据差异或不同的格式(例如 PNG 与 BMP)或文件末尾的杂散字节等…

发布对文件进行哈希处理的代码毫无意义,这里完全不相关。

此外,我怀疑您真的需要选择不同的哈希算法,SHA-2 对这项工作来说应该足够好。
holdoffhunger at gmail dot com
12 年前
getImageSignature 函数返回 SHA-256 哈希值,其长度为 256 位(或 32 字节)。SHA-256 是由 NSA 设计的 SHA-2 加密哈希函数集的一部分,其中还包括 SHA-224、SHA-384 和 SHA-512。根据维基百科,它存在一些与 SHA-1 哈希函数集类似的安全漏洞,最终应该通过 SHA-3 来修复。与 MD5 或 SHA-1 加密函数集不同,SHA-2 尚未发现任何冲突(冲突是指两个不同的数据片段导致哈希函数产生相同哈希值的情况)。目前,它似乎是为文件或数据片段创建小型(32 字节)、唯一可识别、通常安全的值得最有效的方法。

一些示例代码

<?php

// 作者:[email protected]

// Imagick 类型
// ---------------------------------------------

$imagick_type = new Imagick();

// 打开文件
// ---------------------------------------------

$file_to_grab = "image_workshop_directory/test.bmp";

$file_handle_for_viewing_image_file = fopen($file_to_grab, 'a+');

// 获取文件
// ---------------------------------------------

$imagick_type->readImageFile($file_handle_for_viewing_image_file);

// 获取图像 SHA-256 签名/哈希值
// ---------------------------------------------

$imagick_type_signature = $imagick_type->getImageSignature();

// 打印图像签名/哈希值
// ---------------------------------------------

print($imagick_type_signature);

?>

对标准 BMP 图像执行此操作的结果

cb2f387a7b23d11340ad1f5ba9c765125ea6b2d50a0d25412abe1ce568adac68
holdoffhunger at gmail dot com
12 年前
PHP 中 ImageMagick 包的 getImageSignature 函数仅返回图像的 SHA-1 哈希值。ImageMagick 包中没有其他可用的算法,但幸运的是,这是 PHP,您可以使用各种哈希算法处理任何图像文件。函数 hash_algos() 将返回 PHP 中可用的哈希算法数组,函数 hash_file() 将采用三个参数(一个用于要使用的算法,一个用于文件名,以及一个可选的二进制输出变量)。您无需局限于 getImageSignature 函数的 SHA-1 算法,您可以使用 SHA-256、SHA-384、SHA-512、Whirlpool、HAVAL、Salsa、Gost、Adler32、CRC32 或 MD5 等以及这些算法的变体。

但是,对文件执行的 hash_file() 函数的 SHA-1 结果与 getImageSignature() 函数的 SHA-1 结果不同。这让我相信 getImageSignature() 的 SHA-1 可能是对 Imagick 对象本身执行的,而不是对文件执行的,而 hash_file() 函数显然是对文件本身执行的。但这只是猜测。

另一种哈希算法的示例代码,对图像文件执行每种算法

<?php

// 作者:[email protected]

// 设置用于哈希函数的文件
// ---------------------------------------------------

$filename_with_folder_for_hashing = "image_workshop/test_file.bmp";

// 获取动态哈希算法列表
// ---------------------------------------------------

$php_dynamic_hash_algorithms = hash_algos();

// 统计动态哈希算法列表数量
// ---------------------------------------------------

$number_of_dynamic_hash_algorithms = count($php_dynamic_hash_algorithms);

// 解析动态哈希算法列表
// ---------------------------------------------------

for($i = 0; $i < $number_of_dynamic_hash_algorithms; $i++)
{
// 获取当前哈希算法
// ---------------------------------------------------

$current_hashing_algorithm = $php_dynamic_hash_algorithms[$i];

// 对文件执行哈希运算
// ---------------------------------------------------

$current_hashing_algorithm_hex_result = hash_file($current_hashing_algorithm, $filename_with_folder_for_hashing, FALSE);

// 打印哈希结果
// ---------------------------------------------------

print("$current_hashing_algorithm 算法 ::: $current_hashing_algorithm_hex_result");
print(
"<br><br>");
}

?>

示例结果
...........................

md2 算法 ::: 03205df9c6717d74f1f003c66f58e98a

md4 算法 ::: b2a204a2e5c3968d2abd5dc372fbee10

md5 算法 ::: b9d92a61714b221d24c7730d4764ca82

sha1 算法 ::: 8db4c92346c26568b13ea43fbcf514e37942a41a

(还有 34 个算法...)
To Top