(PHP 5 >= 5.6.0, PHP 7, PHP 8)
hash_equals — 時序攻擊安全字串比較
檢查兩個字串是否相等,不會透過執行時間洩漏 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
,並且在發生時序攻擊的情況下,已知字串的長度可能會洩漏。