hash_equals

(PHP 5 >= 5.6.0, PHP 7)

hash_equalsタイミング攻撃に対して安全な文字列比較

説明

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

2つの文字列が等しいかどうか、同じ長さの時間で比較します。

この関数は、タイミング攻撃を緩和するために使われるべきです。 たとえば crypt() によるパスワードのハッシュを検証する場合などです。

パラメータ

known_string

比較対象とする既知の長さの文字列

user_string

ユーザー指定の文字列

返り値

2つの文字列が等しい場合は TRUE を返し、そうでない場合は FALSE を返します。

エラー / 例外

指定されたパラメータのいずれかが文字列でない場合、 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)

注意

注意:

正しく比較するには、両方の引数が同じ長さでなければなりません。 異なる長さの引数を与えた場合、 FALSE が直ちに返され、 タイミング攻撃を加えられていると、既知の文字列の長さが漏れる可能性があります。

注意:

ユーザー指定の文字列を、最初ではなく2番目のパラメーターとして指定することが重要です。