PHPでは、ハッシュ関数は、パスワード検証やデータの整合性検証などのシナリオで広く使用されています。データセキュリティを確保するには、2つのハッシュ値が一貫しているかどうかを判断する必要があることがよくあります。 PHPは、ハッシュ値を生成および比較するための複数の関数を提供します。 Hash_CopyとHash_equalsは、ハッシュ値の比較作業を完了するのに効果的に役立つ2つの一般的に使用される関数です。
hash_copy
HASH_COPY関数は実際にはPHPには存在しません。同様の声明は、いくつかの文書や記事で見られる場合がありますが、それらは誤用または誤解される可能性があります。ハッシュ比較とPHPでのコピーの一般的な関数は、hash()とhash_equals()です。
Hash_equals
Hash_equalsは、2つのハッシュ値を安全に比較するためにPHPによって提供される関数です。その機能は、時間差攻撃を防ぐことです。従来の文字列比較により、攻撃者は、比較操作の時差を比較することにより、ハッシュ値の違いを推測できます。 Hash_equalsは、2つのハッシュ値の長さが同じである場合、これらの時間の違いが公開されないことを確認する場合、文字ごとの比較を実行します。
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$known_string</span></span><span> , </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$user_string</span></span><span> )
</span></span>
$ nown_string :既知のハッシュ値または文字列。
$ user_string :ユーザーが入力したハッシュ値または文字列。
戻り値:2つの文字列がまったく同じ場合はtrueを返し、それ以外の場合はfalseを返します。
2つのハッシュ値が一貫しているかどうかを比較する場合、 Hash_equals関数を使用して、安全で正確な判断を確保できます。一般的な例は、ユーザーが入力したパスワードがデータベースに保存されているハッシュ値と一致していることを確認する必要があるとします。
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// データベースに保存されているハッシュ値があると仮定します</span></span><span>
</span><span><span class="hljs-variable">$stored_hash</span></span><span> = </span><span><span class="hljs-string">'$2y$10$V5ldlhO.Jk19pZpWzchL7vJdknz57Vry8V15hATFmgt0gt04SKeQK'</span></span><span>; </span><span><span class="hljs-comment">// ハッシュされたパスワード</span></span><span>
</span><span><span class="hljs-comment">// ユーザーが入力したパスワード</span></span><span>
</span><span><span class="hljs-variable">$user_input_password</span></span><span> = </span><span><span class="hljs-string">'user_password'</span></span><span>;
</span><span><span class="hljs-comment">// 使用 password_hash ハッシュを生成して検証します</span></span><span>
</span><span><span class="hljs-variable">$input_hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$user_input_password</span></span><span>, PASSWORD_DEFAULT);
</span><span><span class="hljs-comment">// 使用 hash_equals 2つのハッシュ値の比較</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">hash_equals</span></span><span>(</span><span><span class="hljs-variable">$stored_hash</span></span><span>, </span><span><span class="hljs-variable">$input_hash</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"一貫したパスワード!"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"パスワードは一貫性がありません!"</span></span><span>;
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
この例では、 password_hashはユーザーのパスワードをハッシュしていますが、 Hash_equalsの役割は、比較中に長さが異なるため、または遅延の違いによりセキュリティリスクが潜在的でないことを確認することです。
PHPの文字列比較操作( ==またはstrcmp()など)は、実行時間が文字列の長さと内容に依存するため、特定のセキュリティリスクがあります。ハッシュ値などの機密データの場合、 ==を使用して直接比較すると、攻撃者は、文字列比較の実行時間を分析することにより、ハッシュ値の違いを推測できます。この攻撃方法は、時差攻撃と呼ばれます。
Hash_equalsは、そのような攻撃を回避するように設計されています。 2つの文字列の長さを一貫性を強制し、バイトバイトによって比較し、時間の違いによって引き起こされる安全上の危険を排除します。
ユーザー認証<br> ユーザーがログインすると、通常、ユーザーが入力したパスワードをハッシュしてから、データベースに保存されているハッシュ値と比較します。検証プロセスが安全であることを確認するには、 Hash_equalsを使用する必要があります。
データの整合性検証<br> データを送信するとき、データのハッシュ値を計算して受信機に送信できます。受信者は、 Hash_equalsを使用して、受信したハッシュ値をローカルで計算されたハッシュ値と比較して、データが改ざんされているかどうかを判断できます。
ファイルハッシュを生成して比較します<br> ファイルの内容をハッシュすることにより、ファイルが変更されたかどうかを判断できます。 Hash_equalsは、ファイルハッシュ値を比較すると、外部攻撃を回避することを保証します。
Hash_equalsは、PHPの非常に安全で効率的なハッシュ比較関数であり、時差攻撃を効果的に防ぐことができます。 Hash_Copyは組み込みのPHP関数ではありませんが、 Hash()やHash_equalsなどの関数を介してハッシュ値を安全に処理および比較できます。機密データを検証する必要がある場合は、常にHASH_EQUALSを使用して、比較プロセスのセキュリティを確保し、潜在的なセキュリティリスクを回避する必要があります。