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番目のパラメーターとして指定することが重要です。