Paragon Initiative Enterprises によって作成および保守されているrandom_bytes()
およびrandom_int()
用の PHP 5.x ポリフィル。
このライブラリは以前のバージョンの PHP で機能するはずですが、サポートされている PHP バージョンに関連する問題のみを考慮します。サポートされていないバージョンの PHP を使用している場合は、できるだけ早くアップグレードしてください。
このライブラリは PHP コミュニティの一部のセキュリティ専門家によって検査されていますが、何かを見落とす可能性は常にあります。運用環境への導入を考える前に、お気に入りの信頼できるハッカーに実装エラーやバグを徹底的に調べてもらうように依頼してください。
master ブランチを使用せず、安定したリリースを使用してください。
このライブラリの背景については、PHP でのランダムな整数と文字列の生成に関するブログ投稿を参照してください。
PHP がランダム データを安全に生成できない場合、このライブラリはException
をスローします。安全でないランダム データにフォールバックすることはありません。この問題が引き続き発生する場合は、すぐに新しいバージョンの PHP にアップグレードしてください。
作曲家の場合:
# For libraries and frameworks that support PHP 5 but may be used by # other software that only supports PHP 7: composer require paragonie/random_compat:>=2 # For software that explicitly needs PHP 5 support: composer require paragonie/random_compat:<9.99
署名付き PHP アーカイブ:
バージョン 1.2.0 では、Github 上の各安定リリースに ECDSA 署名付き PHP アーカイブも同梱されています。
.phar
、 .phar.pubkey
、および.phar.pubkey.asc
ファイルをダウンロードします。
(推奨ですが必須ではありません) Paragon Initiative Enterprises の PGP 公開キーを使用して、 .phar.pubkey
( .asc
ファイル内に含まれる) の PGP 署名を検証します。
.phar
と.phar.pubkey
ファイルの両方を同じディレクトリに抽出します。
require_once "/path/to/random_compat.phar";
新しいバージョンがリリースされた場合、 .phar
ファイルを置き換えるだけで済みます。 .pubkey
は変更されません (署名キーが危険にさらされない限り)。
手動インストール:
安定版リリースをダウンロードします。
ファイルをプロジェクトに抽出します。
require_once "/path/to/random_compat/lib/random.php";
エントリポイントは、 /lib
内の他のファイルではなく、 lib/random.php
に直接指定する必要があります。
このライブラリは、PHP 5 プロジェクトで使用するために PHP 7 で追加された CSPRNG 関数を公開します。それらの動作は同一である必要があります。
{$string = random_bytes(32); を試してください。 } catch (TypeError $e) {// まあ、これは整数なので、これはunexpected.die("予期しないエラーが発生しました"); } catch (Error $e) {// 32 は妥当な整数であるため、これも予期せぬものです。die("予期しないエラーが発生しました"); } catch (Exception $e) {// このメッセージが表示された場合は、CSPRNG が失敗しています。hard.die("ランダムな文字列を生成できませんでした。私たちの OS は安全ですか?"); }var_dump(bin2hex($string));// string(64) "5787c41ae124b3b9363b7825104f8bc8cf27c4c3036573e5f0d4a91ad2eeac6f"
{$int = random_int(0, 255); を試してください。 } catch (TypeError $e) {// まあ、これは整数なので、これはunexpected.die("予期しないエラーが発生しました"); } catch (Error $e) {// 0 と 255 は両方とも適切な整数であるため、これも予期せぬものです。die("予期しないエラーが発生しました"); } catch (Exception $e) {// このメッセージが表示された場合は、CSPRNG が失敗しています。hard.die("ランダムな int を生成できませんでした。私たちの OS は安全ですか?"); }var_dump($int);// int(47)
例外とエラーを処理するときは、PHP 5 と PHP7 の違いを考慮する必要があります。
違い:
Error
のキャッチは、 Exception
の前にキャッチされる限り機能します。
以前にError
キャッチしなかった場合、 Exception
キャッチすると動作が異なります。
すべてのエラー/例外をキャッチする移植可能な方法はありません。
Exception
の前に常にError
キャッチします。
{return random_int(1, $userInput); を試してください。 } catch (TypeError $e) {// これは、「Exception」の前に「Error」がキャッチされる限り問題ありません。throw new Exception('数字を入力してください!'); } catch (Error $e) {// これは必須ですが、何もする必要がない場合は単に rethrow.throw $e; だけです。 } catch (Exception $e) {// これはオプションであり、生成中にエラーを処理したくない場合は省略することもできます。throw new InternalServerErrorException('おっと、サーバーが故障しているため、ランダム データを生成できません。',500 ,$e); }
例外がスローされた場合、オペレーティング システムは安全ではありません。
Windows を使用している場合は、mcrypt を必ず有効にしてください。
他の OS を使用している場合は、 /dev/urandom
が読み取り可能であることを確認してください。
FreeBSD ジェイルはホスト OS から/dev/urandom
公開する必要がある
open_basedir
使用する場合は、 /dev/urandom
が許可されていることを確認してください
このライブラリは、安全でない乱数ジェネレーターにフォールバックしません (また、フォールバックするパッチも受け入れません)。
プロジェクトを使用している場合、composer.json に次のような行が含まれている場合
"require" { ... "paragonie/random_compat": "~1.1", ... }
...その後、random_compat 2 (または、この安全な PHP 暗号化ライブラリなど、random_compat 2 を明示的に必要とする別のライブラリ) を追加しようとすると、バージョンの競合が発生します。
解決策は、ユーザーをバージョン 1 にハードロックするのではなく、バージョン 2 以降を使用できるように、プロジェクトの要件文字列を更新することです。
"必要とする" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1",... }
注: このライブラリには何も行わない9.99.99
という特別なバージョンがありますが、PHP 7 にのみインストールできます。
PHP 5 をサポートしているが、サポートしていないソフトウェアによって使用される可能性があるソフトウェア (ライブラリなど) を作成している場合は、 9.99.99
インストールを許可する必要があります。上記の差分があなたが望むものです。
逆に、(それ自体で) PHP 5 をサポートするソフトウェアを作成している場合は、9.99.99 をインストールしたくないので、代わりに次の変更を加えることになります。
"必要とする" { ...- "paragonie/random_compat": "~1.1",+ "paragonie/random_compat": ">=1 <9.99",... }
「空の」バージョン9.99.99
のインストールを回避するには、ルートのcomposer.json
にreplace
セクションを追加します。
"replace": { "paragonie/random_compat": "9.99.99" },
Composer ではなく PHP Archive (Phar) アプローチを使用していて、「マニフェスト読み取り長は{int1}
である必要があります{int2}
」という趣旨のエラー メッセージが表示される場合は、Phar 拡張機能が有効になっていない可能性があります。
この問題を修正する方法の具体的なガイダンスについては、このコメントを参照してください。
以下の方々の貢献がなければ、このプロジェクトは今日ほど素晴らしいものにはならなかったでしょう。
@AndrewCarterUK (アンドリュー・カーター)
@asgrim (ジェームズ・ティットカンブ)
@bcremer (ベンジャミン・クレーマー)
@chriscct7 (クリス・クリストフ)
@CodesInChaos (クリスチャン・ウィナーレイン)
@ConnorVG (コナー・S・パークス)
@cs278 (クリス・スミス)
@cweagans (キャメロン・イーガンス)
@dd32 (ディオン・ハルス)
@geggleto (グレン・エグルトン)
@glensc (エラン・ルーサミー)
@GrahamCampbell (グラハム・キャンベル)
@ircmaxell (アンソニー・フェラーラ)
@jdevalk (ヨースト・デ・ヴァルク)
@jedisct1 (フランク・デニス)
@juliangut (ジュリアン・グティエレス)
@kelunik (ニクラス・ケラー)
@lt (リー)
@MasonM (メイソン・マローン)
@menkaff (メヘラン・ニクナフス)
@mmeyer2k (マイケル M)
@narfbg (アンドレイ・アンドレーエフ)
@nicolas-grekas (ニコラス・グレカス)
@ocean90 (ドミニク・シリング)
@oittaa
@oucil (ケビン・ファーリー)
@philios33 (フィル・ニコルズ)
@redragonx (スティーブン・チャベス)
@relaxnow (バウケマ少年)
@rchouinard (ライアン・シュイナード)
@rugk
@SammyK (サミー・ケイ・パワーズ)
@scottchiefbaker (スコット・ベイカー)
@skyosev (ストヤン・キョセフ)
@sthen (スチュアート・ヘンダーソン)
@stof (クリストフ・コエヴォエ)
@teohhanhui (テオ・ハンフイ)
@tom-- (トム・ワースター)
@tsyr2ko
@trowski (アーロン・ピオトロフスキー)
@ツイスター (クリス・レパネン)
@vinkla (ヴィンセント・クライバー)
@voku (ラース・モレケン)
@xabbuh (クリスチャン・フロスマン)
あなたの会社が製品またはサービスでこのライブラリを使用している場合は、Paragon Initiative Enterprises からサポート契約を購入することに興味があるかもしれません。