(PHP 5 >= 5.6.0, PHP 7, PHP 8)
hash_equals — 防时序攻击的字符串比较
$known_string
, #[\SensitiveParameter] string $user_string
): bool检查两个字符串是否相等,无需通过执行时间泄露known_string
的内容。
此函数可用于减轻时序攻击。使用===
进行常规比较,其执行时间会根据两个值是否相同以及第一个差异所在位置而有所不同,从而泄露秘密known_string
的内容。
务必将用户提供的字符串作为第二个参数,而不是第一个参数。
示例 #1 hash_equals() 示例
<?php
$secretKey = '8uRhAeH89naXfFXKGOEj';
// 值和签名由用户提供,例如在 URL 中
// 并使用 $_GET 获取。
$value = 'username=rasmuslerdorf';
$signature = '8c35009d3b50caf7f5d2c1e031842e6b7823a1bb781d33c5237cd27b57b5f327';
if (hash_equals(hash_hmac('sha256', $value, $secretKey), $signature)) {
echo "该值已正确签名。", PHP_EOL;
} else {
echo "该值已被篡改。", PHP_EOL;
}
?>
以上示例将输出
The value is correctly signed.
注意:
两个参数必须长度相同才能成功比较。当提供长度不同的参数时,将立即返回
false
,并且在发生时序攻击时,可能会泄露已知字符串的长度。