当前位置: 首页> 最新文章列表> 使用 hash_final 和 hash_equals 比较哈希值的方法

使用 hash_final 和 hash_equals 比较哈希值的方法

gitbox 2025-05-29

hash_final 是 PHP 中一个用于从哈希上下文中获取最终哈希值的函数。通常,hash_final 会与 hash_inithash_update 函数一起使用,用于逐步构建哈希值。hash_final 生成的哈希值是不可变的。

hash_final 函数语法:

string hash_final ( resource $context [, bool $raw_output = false ] )
  • $context:通过 hash_inithash_update 等函数创建的哈希上下文。

  • $raw_output:如果为 true,将返回原始二进制数据;如果为 false(默认值),将返回十六进制字符串。

示例:

<?php
$data = "Hello, World!";
$context = hash_init('sha256');
hash_update($context, $data);
$hash = hash_final($context);

echo "Hash value: " . $hash;
?>

输出结果:

Hash value: a591a6d40bf420404a011733cfb7b190d62c65bf0bcda01c8007c6f4adf4a0a2

在这个例子中,我们使用 hash_init 初始化一个 SHA-256 哈希上下文,利用 hash_update 更新哈希数据,并通过 hash_final 获取最终的哈希值。

2. hash_equals 函数简介

hash_equals 函数是 PHP 中用于安全比较两个哈希值的函数。它是防止时间攻击的关键工具。在没有 hash_equals 时,简单的 == 运算符比较哈希值可能因为字符串长度的不同而导致时间泄漏,这可以被黑客利用来推测某些信息。

hash_equals 通过比较两个字符串的哈希值,确保在任何情况下都消耗相同的时间,因此避免了时间攻击。

hash_equals 函数语法:

bool hash_equals ( string $known_string , string $user_string )
  • $known_string:已知的哈希值(通常是存储在数据库中的哈希值)。

  • $user_string:用户输入的哈希值。

示例:

<?php
$stored_hash = "a591a6d40bf420404a011733cfb7b190d62c65bf0bcda01c8007c6f4adf4a0a2";
$user_input = "Hello, World!";

if (hash_equals($stored_hash, hash('sha256', $user_input))) {
    echo "The hashes match.";
} else {
    echo "The hashes do not match.";
}
?>

输出结果:

The hashes match.

在这个例子中,hash_equals 被用来安全地比较存储的哈希值和用户输入的哈希值。如果两个哈希值相等,意味着输入正确。

3. 结合使用 hash_finalhash_equals

通常,我们会将 hash_finalhash_equals 一起使用,以确保安全地计算并比较哈希值。例如,在处理密码验证时,我们会先使用 hash_final 创建密码的哈希值,然后使用 hash_equals 将用户输入的密码与存储在数据库中的哈希值进行安全比较。

完整示例:

<?php
// 假设用户提交的密码
$user_input_password = "user_password123";

// 存储在数据库中的密码哈希(例子中直接硬编码)
$stored_password_hash = "a591a6d40bf420404a011733cfb7b190d62c65bf0bcda01c8007c6f4adf4a0a2";

// 通过 hash_final 计算输入密码的哈希值
$context = hash_init('sha256');
hash_update($context, $user_input_password);
$user_input_hash = hash_final($context);

// 使用 hash_equals 安全地比较密码哈希值
if (hash_equals($stored_password_hash, $user_input_hash)) {
    echo "Password is correct.";
} else {
    echo "Password is incorrect.";
}
?>

输出结果:

Password is correct.

在这个例子中,我们使用 hash_final 计算用户输入密码的哈希值,然后通过 hash_equals 与存储的哈希值进行比较。这样,我们确保了哈希值比较的安全性,防止了可能的时间攻击。