1. ホーム
  2. php

[解決済み] PHP で single use トークンを生成する: random_bytes と openssl_random_pseudo_bytes のどちらを使用しますか?

2022-02-04 05:44:25

質問

PHPでシングルユーストークンを生成する必要があります。これには、同じことを行うように見える2つの関数が利用できます。 ランダムバイト openssl_random_pseudo_bytes . 例えば random_bytes :

var_dump(bin2hex(random_bytes(12)));

--> string(24) "338f489ec37a2c2b4943905d"

を使用し openssl_random_pseudo_bytes :

var_dump(bin2hex(openssl_random_pseudo_bytes(12)));

--> string(24) "1c7febea20029bd524fba8e7"

openssl_random_pseudo_bytes はPHP5.3以上(なのでもっと前からあると思われます)、そして random_bytes はPHP 7です。私はPHP7を使用しているので、どちらを使っても大丈夫です。

では、この2つの間に大きな(あるいは小さな)違いがあるのでしょうか?ないのであれば、私は random_bytes 単に名前が簡単だから(=コードが読みやすいから)。

どのように解決するのですか?

openssl_random_pseudo_bytes は OpenSSL 拡張の一部であり、明示的に指定する必要があります。 を設定し、インクルードします。 を PHP のコンパイル時に使用し、外部からの依存性を必要とします。

random_bytes は、PHP 7 で新しく導入された、常に利用可能な PHP 独自のランダムバイト生成方式で、利用するプラットフォームに応じて内部のランダム性を選択します。

を導入した主な理由は random_bytes 開発者はプラットフォームを意識する必要があり、どの拡張モジュールやシステムレベルの関数が利用可能かによって、いくつかの異なるフォールバックメソッドを使用する可能性があるからです。これはしばしば個々の実装のバグにつながり、特にセキュリティに関連するコードでは気になるところです。 random_bytes は、常に利用可能で、利用可能な最も良いランダム性の源を使用する1つの関数を提供することによって、これを簡素化します。もし、PHP 7+ のみをターゲットにしているのなら、この方法を使用すべきです。