hash_equals

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

hash_equals可防止時(shí)序攻擊的字符串比較

說明

hash_equals(string $known_string, string $user_string): bool

比較兩個(gè)字符串,無論它們是否相等,本函數(shù)的時(shí)間消耗是恒定的。

本函數(shù)可以用在需要防止時(shí)序攻擊的字符串比較場(chǎng)景中, 例如,可以用在比較 crypt() 密碼哈希值的場(chǎng)景。

參數(shù)

known_string

已知長(zhǎng)度的、要參與比較的 string

user_string

用戶提供的字符串

返回值

當(dāng)兩個(gè)字符串相等時(shí)返回 true,否則返回 false。

錯(cuò)誤/異常

如果所提供的 2 個(gè)參數(shù)中任何一個(gè)不是字符串, 會(huì)導(dǎo)致 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));
?>

以上例程會(huì)輸出:

bool(true)
bool(false)

注釋

注意:

要想成功進(jìn)行比較,那么所提供的 2 個(gè)參數(shù)必須是相同長(zhǎng)度的字符串。 如果所提供的字符串長(zhǎng)度不同,那么本函數(shù)會(huì)立即返回 false, 在時(shí)序攻擊的場(chǎng)景下,已知字符串的長(zhǎng)度可能會(huì)被泄露。

注意:

非常重要的一點(diǎn)是,用戶提供的字符串必須是第二個(gè)參數(shù)。