hash_equals 是 PHP 专门用来安全地比较两个字符串是否相等的函数,通常用在比较哈希值(比如密码哈希、签名等)的时候。它和普通的 == 或 === 比较运算符不同,主要原因是防止时序攻击(Timing Attack)。

时序攻击是一种针对计算机系统的安全攻击方式,攻击者通过测量程序执行某些操作所耗费的时间差异,来间接获取敏感信息,比如密码、加密密钥或其他机密数据。

为什么不用 == 或 === 来比较哈希?

  • == 和 === 比较字符串时,会遇到第一个不匹配的字符就立刻返回结果,比较过程中的时间长短会根据字符串前面匹配的字符长度变化。
  • 攻击者可以通过测量比较操作耗时,推测出哈希字符串的部分内容,从而进行密码猜测或者伪造签名。

hash_equals 怎么解决这个问题?

  • 它使用常量时间比较算法,不管字符串有多少相同字符,比较时间都是固定的。
  • 这样攻击者无法通过耗时推断字符串内容,提高了安全性。

具体举例

$hash1 = hash('sha256', 'password123');
$hash2 = hash('sha256', 'password124');

// 不安全的比较
if ($hash1 === $hash2) {
    echo "匹配";
} else {
    echo "不匹配";
}

// 安全的比较
if (hash_equals($hash1, $hash2)) {
    echo "匹配";
} else {
    echo "不匹配";
}

总结

  • hash_equals 用于防止时序攻击的安全比较。
  • 直接用 == 或 === 会暴露字符串比较时间差,存在安全隐患。
  • 用于比较密码哈希、签名校验、Token 等安全相关的字符串。

你要是写安全相关代码,特别是验证哈希时,推荐一定用 hash_equals。