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_DEFAULT | bcrypt アルゴリズムを使います (PHP 5.5.0 の時点でのデフォルトです)。 新しくてより強力なアルゴリズムが PHP に追加されれば、 この定数もそれにあわせて変わっていきます。 そのため、これを指定したときの結果の長さは、変わる可能性があります。 |
---|---|
PASSWORD_BCRYPT | CRYPT_BLOWFISH アルゴリズムを使ってハッシュを作ります。 標準のcrypt()互換のハッシュ。失敗するとfalseを返す。 |
PASSWORD_ARGON2I | Argon2i ハッシュアルゴリズムを使って ハッシュを作ります。このアルゴリズムは、 PHP が Argon2 のサポートを有効にしてコンパイルした場合のみ利用できます。 |
PASSWORD_ARGON2ID | Argon2id ハッシュアルゴリズムを使って ハッシュを作ります。このアルゴリズムは、 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 エンコードされた文字列を受け取り、 与えられた暗号化方式とキーを使って文字列を復号します。
参考記事
ランダムな文字列の生成