【PHP8.x】openssl_random_pseudo_bytes関数の使い方

作成日: 更新日:

openssl_random_pseudo_bytes関数は、暗号学的に強い疑似乱数のバイト文字列を生成する関数です。この関数は、予測することが極めて困難なランダムなデータを生成するため、セキュリティが重要となる場面で広く利用されます。第一引数には、生成したいバイト文字列の長さを整数で指定します。例えば、16を指定すると16バイトのランダムなデータが返されます。オプションの第二引数には変数を参照渡しで指定することができ、関数の実行後、この変数には生成された乱数が暗号学的に強いものであったかを示す真偽値が格納されます。この値がtrueであれば安全な乱数であることを意味し、falseであれば安全ではないため使用すべきではありません。セキュリティに関わる機能を実装する際には、この第二引数を用いて乱数の強度を必ず検証することが強く推奨されます。関数は、処理に成功すると指定された長さのバイト文字列を返し、失敗した場合はfalseを返します。この関数は、セッションID、トークン、暗号化キーの初期化ベクトル(IV)などの生成に適しています。

基本的な使い方

構文(syntax)

$random_bytes = openssl_random_pseudo_bytes($length, $crypto_strong);

引数(parameters)

int $length, ?bool &$strong_result = null

  • int $length: 生成したいランダムバイト列の長さをバイト単位で指定する整数。
  • ?bool &$strong_result: (オプション) 生成されたバイト列が、暗号学的に安全な疑似乱数生成器によって生成されたかどうかを示すブール値を格納する参照変数。true の場合は安全、false の場合は安全でないことを示します。

戻り値(return)

string|false

openssl_random_pseudo_bytes 関数は、指定された長さの擬似乱数を表す文字列、またはエラー発生時には false を返します。

サンプルコード

openssl_random_pseudo_bytesとrandom_bytesの比較

<?php

/**
 * openssl_random_pseudo_bytes と random_bytes の違いを比較し、
 * ランダムバイトを生成するサンプルコード。
 *
 * @param int $length 生成するランダムバイトの長さ(デフォルトは32バイト)
 * @return void
 */
function compareRandomByteGenerators(int $length = 32): void
{
    echo "--- {$length}バイトのランダムバイト生成の比較 ---\n\n";

    // 1. random_bytes() の使用 (推奨される方法)
    // この関数は、暗号学的に安全なランダムバイトを生成することを保証します。
    // 安全なバイトを生成できない場合は例外をスローします。
    try {
        $secureBytes = random_bytes($length);
        echo "● random_bytes() を使用:\n";
        echo "  生成されたバイト (16進数): " . bin2hex($secureBytes) . "\n";
        echo "  暗号学的に安全: はい (保証されます)\n\n";
    } catch (Exception $e) {
        echo "● random_bytes() でエラーが発生: " . $e->getMessage() . "\n\n";
    }

    // 2. openssl_random_pseudo_bytes() の使用
    // この関数は、擬似ランダムバイトを生成します。
    // 第2引数 ($strongResult) は参照渡しで、結果が暗号学的に強いかどうかを示します。
    // PHP 7 以降では random_bytes() が推奨されます。
    $strongResult = false; // 結果の強度を格納するための変数
    $pseudoBytes = openssl_random_pseudo_bytes($length, $strongResult);

    if ($pseudoBytes !== false) {
        echo "● openssl_random_pseudo_bytes() を使用:\n";
        echo "  生成されたバイト (16進数): " . bin2hex($pseudoBytes) . "\n";
        echo "  暗号学的に強い結果: " . ($strongResult ? "はい" : "いいえ") . "\n";
        echo "  注意: このメソッドは暗号学的に弱いバイトを返す可能性があるため、"
             . "常に \$strongResult の値を確認する必要があります。\n"
             . "  現代のアプリケーションでは、random_bytes() の使用が推奨されます。\n\n";
    } else {
        echo "● openssl_random_pseudo_bytes() でエラーが発生: バイトの生成に失敗しました。\n\n";
    }

    echo "--- 比較終了 ---\n";
}

// 関数を実行してランダムバイト生成の例を示す
compareRandomByteGenerators(16); // 16バイトのランダムバイトを生成

PHPのopenssl_random_pseudo_bytes関数は、指定された長さの擬似ランダムバイト列を生成します。最初の引数$lengthには生成したいバイト数を整数で指定します。二番目の引数$strong_resultは参照渡しで、この変数には、生成されたバイト列が暗号学的に強いランダム性を持っているかどうかの結果(trueまたはfalse)が格納されます。関数は成功するとバイト列を含む文字列を返し、失敗した場合はfalseを返します。

この関数は「擬似ランダム」であり、常に暗号学的に安全なバイトを生成できるわけではないため、セキュリティを重視する用途では注意が必要です。現代のPHP開発では、暗号学的に安全なランダムバイトの生成を保証するrandom_bytes関数の使用が強く推奨されています。random_bytes関数は、安全なバイトを生成できない場合は例外をスローすることで、その安全性を保証します。サンプルコードでは、これら二つの関数の違いとそれぞれの利用方法、そしてopenssl_random_pseudo_bytesを使用する際に$strong_resultの値を確認することの重要性を示しています。

セキュリティが重要なランダムバイト生成には、random_bytes()の利用を強く推奨します。この関数は暗号学的に安全なランダムバイトを保証し、生成に失敗した場合は例外をスローするため、安全性が高くエラーハンドリングが容易です。一方、openssl_random_pseudo_bytes()は擬似ランダムバイトを生成するため、セキュリティが要求される用途には注意が必要です。この関数を使用する際は、戻り値がfalseでないこと、そして第2引数で渡す$strong_result変数がtrueであることを必ず確認してください。falsetrue以外の場合は、暗号学的に安全でない可能性があります。PHP 7.0以降ではrandom_bytes()が利用できるため、特別な理由がない限りそちらを選択することが、より安全なコードを記述するための基本となります。

【PHP8.x】openssl_random_pseudo_bytes関数の使い方 | いっしー@Webエンジニア