PHP Conference Japan 2024

hash_equals

(PHP 5 >= 5.6.0, PHP 7, PHP 8)

hash_equals時序攻擊安全字串比較

說明

hash_equals(#[\SensitiveParameter] 字串 $known_string, #[\SensitiveParameter] 字串 $user_string): 布林值

檢查兩個字串是否相等,不會透過執行時間洩漏 known_string 的內容資訊。

此函數可用於減輕時序攻擊。使用 === 進行常規比較,根據兩個值是否不同以及第一個差異所在的位置,執行時間會有所不同,從而洩漏關於秘密 known_string 內容的資訊。

注意事項

重要的是將使用者提供的字串作為第二個參數,而不是第一個。

參數

known_string

必須保密的已知 字串

user_string

要與之比較的使用者提供的 字串

傳回值

當兩個字串相等時,傳回 true,否則傳回 false

範例

範例 #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,並且在發生時序攻擊的情況下,已知字串的長度可能會洩漏。

參見

  • hash_hmac() - 使用 HMAC 方法產生金鑰雜湊值

新增註記

使用者貢獻的註記

此頁面沒有使用者貢獻的註記。
To Top