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
。
评论区
发表新的留言
您可以留言提出您的疑问或建议。
您的留言得到回复时,会通过您填写的邮箱提醒您。