はじめに
この拡張モジュールは、様々なハッシュアルゴリズムを使って任意の長さのメッセージを直接、または徐々に処理する関数を提供します。可能な処理には、たとえば HMAC 値の生成や、HKDF や PBKDF2 を含む、鍵の導出処理があります。
ハッシュアルゴリズムには、大きく分けて3つのカテゴリがあります。完全な一覧は hash_algos を参照ください。
-
チェックサムアルゴリズム(例:
"crc32b"
, "adler32"
):
通信エラーを検出するときなどに役立つチェックサムを計算するのに使えます。これらは大抵、とても高速です。また、衝突したり、容易に"推測可能な" 値を生成できたりするので、暗号には完全に不向きです。
-
非暗号化アルゴリズム(例:xxHash ファミリ):
ハッシュテーブルで使うハッシュ値を計算するのに用いられます。よって、任意の文字列の入力に対して、うまく分散したハッシュ値を生成するように設計されています。これらも一般的に高速ですが、暗号化の処理には向いていません。
-
暗号化アルゴリズム(例:SHA-2 ファミリ):
入力そのものを表現するものの、それが推測できず、かつ衝突もしにくいハッシュ値を生成するように設計されています。パフォーマンスは二の次とされていますが、モダンなハードウェアはこれらのアルゴリズムの処理を特別に支援するものがあり、PHP も利用可能なときはそれらを使おうとします。
NIST の Computer Security Resource Center には、
» アメリカの連邦通信処理規格(FIPS) が現在認定しているアルゴリズムの説明 があります。
警告
"md4"
"md5"
, "sha1"
のような
初期の暗号化アルゴリズムの中には、既に衝突しやすいことが証明されているものがあります。こうしたアルゴリズムを使うことは、暗号を用いるアプリケーションでは既に推奨されません。
パスワードを処理する際にハッシュ関数を使うためのベストプラクティスに関する情報は、パスワードのハッシュに関するFAQ も参照ください。