当前位置: 首页> 最新文章列表> hash_copy 与 hash_equals 如何配合判断两个哈希值是否一致?

hash_copy 与 hash_equals 如何配合判断两个哈希值是否一致?

M66 2025-07-28

在 PHP 中,哈希函数广泛应用于密码验证、数据完整性校验等场景。为了确保数据安全,我们常常需要判断两个哈希值是否一致。PHP 提供了多个函数来生成和比较哈希值,其中 hash_copyhash_equals 是两个常用的函数,它们能够有效地帮助我们完成哈希值的比较工作。

什么是 hash_copy 和 hash_equals?

  1. hash_copy
    hash_copy 这个函数其实并不存在于 PHP 中。可能在某些文档或文章中看到了类似的表述,这很可能是误用或误解。在 PHP 中常见的用于哈希值比较和复制的函数是 hash()hash_equals()

  2. hash_equals
    hash_equals 是 PHP 提供的一个函数,用于安全地比较两个哈希值。它的作用是防止时间差攻击(timing attack)。通过常规的字符串比较,攻击者可以通过比较比较操作的时间差来推测哈希值的不同。而 hash_equals 会在两个哈希值长度一致的情况下进行逐字符比较,确保不会暴露出这些时间差。

    <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$known_string</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$user_string</span></span><span> )
    </span></span>
    • $known_string:已知的哈希值或字符串。

    • $user_string:用户输入的哈希值或字符串。

    • 返回值:如果两个字符串完全相同,返回 true,否则返回 false

如何使用 hash_equals 判断两个哈希值是否一致?

当我们想要比较两个哈希值是否一致时,可以使用 hash_equals 函数,确保安全且准确地判断。这里有一个常见的示例,假设我们需要验证用户输入的密码是否与存储在数据库中的哈希值一致。

示例:验证用户输入的密码

<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 假设数据库中存储的哈希值</span></span><span>
</span><span><span class="hljs-variable">$stored_hash</span></span><span> = </span><span><span class="hljs-string">'$2y$10$V5ldlhO.Jk19pZpWzchL7vJdknz57Vry8V15hATFmgt0gt04SKeQK'</span></span><span>; </span><span><span class="hljs-comment">// 哈希过的密码</span></span><span>

</span><span><span class="hljs-comment">// 用户输入的密码</span></span><span>
</span><span><span class="hljs-variable">$user_input_password</span></span><span> = </span><span><span class="hljs-string">'user_password'</span></span><span>;

</span><span><span class="hljs-comment">// 使用 password_hash 生成哈希值并验证</span></span><span>
</span><span><span class="hljs-variable">$input_hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$user_input_password</span></span><span>, PASSWORD_DEFAULT);

</span><span><span class="hljs-comment">// 使用 hash_equals 比较两个哈希值</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$stored_hash</span></span><span>, </span><span><span class="hljs-variable">$input_hash</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"密码一致!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"密码不一致!"</span></span><span>;
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

在这个示例中,虽然 password_hash 已经对用户的密码进行了哈希处理,hash_equals 的作用是确保比较时不会因为不同长度或时延差异导致潜在的安全风险。

为什么要使用 hash_equals?

PHP 中的字符串比较操作(如 ==strcmp())存在一定的安全风险,因为它们的执行时间会依赖于字符串的长度和内容。对于哈希值这样的敏感数据,若直接使用 == 进行比较,攻击者可以通过分析字符串比较的执行时间,推测出哈希值的不同之处。这种攻击方法被称为时间差攻击

hash_equals 是为了避免这种攻击而设计的。它会在比较两个字符串时,强制将它们的长度保持一致,并且通过逐字节的方式进行比较,从而消除了由于时间差异带来的安全隐患。

使用场景

  1. 用户身份验证
    在用户登录时,我们通常会将用户输入的密码进行哈希处理,再与数据库中存储的哈希值进行比较。为了确保验证过程安全,应该使用 hash_equals

  2. 数据完整性校验
    在传输数据时,我们可以计算数据的哈希值并传输给接收方。接收方可以使用 hash_equals 比较接收到的哈希值和本地计算的哈希值,以判断数据是否被篡改。

  3. 生成和比较文件哈希
    通过对文件内容进行哈希处理,可以判断文件是否发生变化。hash_equals 能够确保在文件哈希值比较时,避免受到外部攻击。

结论

hash_equals 是 PHP 中一种非常安全且高效的哈希值比较函数,它能够有效防止时间差攻击。虽然 hash_copy 并不是 PHP 内置函数,但我们可以通过 hash()hash_equals 等函数安全地处理和比较哈希值。在需要验证敏感数据时,我们应始终使用 hash_equals 来保证比较过程的安全性,避免潜在的安全风险。