暗号化

crypt(string $string, string $salt): string

文字列の一方向のハッシュ化を行う。
password_verify() は crypt() と互換性があるので、 crypt() が作ったパスワードハッシュは password_verify() でも使えます。
標準の DES ベースの場合、crypt() は出力の最初の 2 文字を salt として使用します。また、 string の最初の 8 文字しか使用しません。 つまり、最初の 8 文字が同じである長い文字列は、 同じ salt を使う限り同じ結果となります。
パスワードを検証するときの文字列比較関数は、 タイミング攻撃に対して脆弱ではないものでなければいけません。 これをもちいて、crypt() の出力と既知のハッシュとを比較します。 この比較を行うために、hash_equals() 関数が使えます。

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

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

// saltを自動的に生成させます; お勧めできません
$hashed_password = crypt('mypassword');

/* 異なったハッシュアルゴリズムが使用された際の問題を避けるために
   crypt()の結果全体をパスワード比較用のsaltとして渡す必要があります。
   (上記のように標準DESに基づくパスワードハッシュは2文字のsaltを使用します
   が、MD5に基づくハッシュは12文字のsaltを使用します) */
if (hash_equals($hashed_password, crypt($user_input, $hashed_password))) {
   echo "Password verified!";
}

password_hash(string $password, string|int|null $algo, array $options = []): string

パスワードハッシュを作る

PASSWORD_BCRYPT がサポートするオプション:
salt (string) – パスワードのハッシュに使うソルトを手動で設定します。 これは、自動生成されたソルトを上書きすることに注意しましょう。
このソルト・オプションは 非推奨になっています。 このオプションは指定せずに、デフォルトで生成されるソルトを使うことを推奨します。 PHP 8.0.0 以降は、この値を明示的に指定しても無視されます

echo password_hash("rasmuslerdorf", PASSWORD_DEFAULT);
アルゴリズム
PASSWORD_DEFAULTbcrypt アルゴリズムを使います (PHP 5.5.0 の時点でのデフォルトです)。 新しくてより強力なアルゴリズムが PHP に追加されれば、 この定数もそれにあわせて変わっていきます。 そのため、これを指定したときの結果の長さは、変わる可能性があります。
PASSWORD_BCRYPTCRYPT_BLOWFISH アルゴリズムを使ってハッシュを作ります。
標準のcrypt()互換のハッシュ。失敗するとfalseを返す。
PASSWORD_ARGON2IArgon2i ハッシュアルゴリズムを使って ハッシュを作ります。このアルゴリズムは、 PHP が Argon2 のサポートを有効にしてコンパイルした場合のみ利用できます。
PASSWORD_ARGON2IDArgon2id ハッシュアルゴリズムを使って ハッシュを作ります。このアルゴリズムは、 PHP が Argon2 のサポートを有効にしてコンパイルした場合のみ利用できます。

password_verify(string $password, string $hash): bool

パスワードがハッシュにマッチするかどうかを調べる
アルゴリズムやコスト、ソルトといった情報もハッシュに含めて返すことに注意しましょう。 したがって、ハッシュの検証に必要な情報はすべてそこに含まれていることになります。 これで、検証関数がハッシュの検証をするときに、ソルトやアルゴリズム情報を別の場所から取得する必要がなくなります。

openssl_encrypt

openssl_encrypt(
    string $data,
    string $cipher_algo,
    string $passphrase,
    int $options = 0,
    string $iv = "",
    string &$tag = null,
    string $aad = "",
    int $tag_length = 16
): string|false

与えられた文字列を与えられたメソッドとキーで暗号化して、 未加工の、または base64 エンコードされた文字列を返します。

openssl_decrypt

openssl_decrypt(
    string $data,
    string $cipher_algo,
    string $passphrase,
    int $options = 0,
    string $iv = "",
    ?string $tag = null,
    string $aad = ""
): string|false

未加工の、または base64 エンコードされた文字列を受け取り、 与えられた暗号化方式とキーを使って文字列を復号します。

tag の長さをこの関数はチェックしません。 この値の長さは openssl_encrypt() を呼び出した時に取得できるものと一致させなければならず、それは呼び出し側の責任です。 一致しない場合でも、与えられた値が適切な tag の先頭部分と一致した場合に復号が成功するかもしれません。

参考記事

ランダムな文字列の生成