(PHP 5 >= 5.6.0, PHP 7, PHP 8)
hash_equals — タイミング攻撃に対して安全な文字列比較
$known_string
, string $user_string
): bool2つの文字列が等しいかどうか、同じ長さの時間で比較します。
この関数は、タイミング攻撃を緩和するために使われるべきです。 たとえば 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番目のパラメーターとして指定することが重要です。