Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
random_bytes() / random_int() / uniqid()対応: PHP 7.0(2015)
暗号学的に安全な乱数やユニークIDを生成する関数です。トークン生成やセキュリティ用途に使用します。
構文
// 暗号学的に安全なランダムバイト列を生成します。 random_bytes($length); // 暗号学的に安全なランダム整数を生成します。 random_int($min, $max); // ユニークIDを生成します。暗号用途には使わないでください。 uniqid($prefix, $more_entropy); // バイナリデータを16進数文字列に変換します。 bin2hex($data);
関数一覧
| 関数 | 概要 |
|---|---|
| random_bytes($length) | 指定したバイト数のCSPRNGによるランダムバイト列を返します。トークンやソルトの生成に使用してください。 |
| random_int($min, $max) | 指定した範囲内のCSPRNGによるランダム整数を返します。偏りのない均一な分布を保証します。 |
| uniqid($prefix, $more_entropy) | マイクロ秒ベースのユニークIDを生成します。予測可能なためセキュリティ用途には使えません。 |
| bin2hex($data) | バイナリデータを16進数文字列に変換します。『random_bytes()』の出力を読みやすい文字列にする際に使います。 |
サンプルコード
<?php
// CSRFトークンの生成例です。暗号学的に安全な方法で生成します。
$csrf_token = bin2hex(random_bytes(32));
echo $csrf_token; // 64文字の16進数文字列が出力されます。
// パスワードリセット用のトークン生成です。
$reset_token = bin2hex(random_bytes(32));
echo strlen($reset_token); // 『64』と出力されます。
// random_int() で安全なランダム整数を生成します。
echo random_int(1, 100); // 1〜100の範囲でランダムな整数が出力されます。
echo random_int(0, 999999); // 6桁の確認コード生成に使えます。
// 6桁のワンタイムパスワードを生成する例です。
$otp = sprintf('%06d', random_int(0, 999999));
echo $otp; // 『042857』のようにゼロ埋めされた6桁が出力されます。
// APIキーの生成例です。
$api_key = 'sk_' . bin2hex(random_bytes(24));
echo $api_key; // 『sk_』で始まる51文字の文字列が出力されます。
// uniqid() はファイル名やログIDなど、一意性だけが必要な場面で使います。
echo uniqid(); // 『65f2a1b3c4d5e』のような13文字のIDが出力されます。
echo uniqid('user_'); // 『user_65f2a1b3c4d5e』のようにプレフィックスが付きます。
echo uniqid('', true); // 『65f2a1b3c4d5e8.12345678』のようにエントロピーが追加されます。
// セッションIDの再生成です。
session_regenerate_id(true); // セッションハイジャック対策に有効です。
// ランダムな文字列の生成関数の例です。
function generate_random_string(int $length = 16): string {
$bytes = random_bytes($length);
return substr(base64_encode($bytes), 0, $length);
}
echo generate_random_string(20); // 20文字のランダムな文字列が出力されます。
概要
『random_bytes()』と『random_int()』はPHP 7.0 で追加されたCSPRNG関数です。CSPRNGとはCryptographically Secure Pseudo-Random Number Generatorの略で、暗号学的擬似乱数生成器のことです。セキュリティトークン、パスワードリセットURL、CSRFトークン、APIキーなど、予測不可能性が求められる場面では必ず『random_bytes()』または『random_int()』を使用してください。『mt_rand()』や『rand()』は予測可能なため、セキュリティ用途には使えません。
『uniqid()』はマイクロ秒ベースで生成されるため一意性はありますが、暗号学的には安全ではありません。ファイル名の生成やログの識別子など、セキュリティとは無関係な場面でのみ使用してください。
パスワードのハッシュ化には『password_hash()』を、ハッシュ値の生成には『hash()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。