可防止時序攻擊的字串比較

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, 在時序攻擊的場景下,已知字串的長度可能會被泄露。

注意:

非常重要的一點是,使用者提供的字串必須是第二個參數。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *