hash_equals
(PHP 5 >= 5.6.0, PHP 7, PHP 8)
hash_equals — 可防止時序攻擊的字串比較
說明
hash_equals(string
$known_string
, string $user_string
): bool比較兩個字串,無論它們是否相等,本函式的時間消耗是恒定的。
本函式可以用在需要防止時序攻擊的字串比較場景中, 例如,可以用在比較 crypt() 密碼雜湊值的場景。
參數
-
known_string
-
已知長度的、要參與比較的 string
-
user_string
-
使用者提供的字串
返回值
當兩個字串相等時返回 true
,否則返回 false
。
錯誤/異常
如果所提供的 2 個參數中任何一個不是字串,
會導致 E_WARNING
訊息。
範例
示例 #1 hash_equals() 例程
<?php
$expected = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$correct = crypt('12345', '$2a$07$usesomesillystringforsalt$');
$incorrect = crypt('apple', '$2a$07$usesomesillystringforsalt$');
var_dump(hash_equals($expected, $correct));
var_dump(hash_equals($expected, $incorrect));
?>
以上例程會輸出:
bool(true) bool(false)
註釋
注意:
要想成功進行比較,那麼所提供的 2 個參數必須是相同長度的字串。 如果所提供的字串長度不同,那麼本函式會立即返回
false
, 在時序攻擊的場景下,已知字串的長度可能會被泄露。
注意:
非常重要的一點是,使用者提供的字串必須是第二個參數。