実際には、ほとんど間違いなく違いはありません。
両方とも、暗号的に安全な疑似乱数バイトのソースを提供しますopenssl_random_pseudo_bytes
。どちらも真に/dev/urandom
ランダムであることが保証されているわけではありませんが、実際には、既知または予測可能な手法によって、両方が真のランダム性と区別できないことが予想されます。
Kmkaplanは/dev/urandom
、次のように、特定の条件下で理論的に予測可能な出力を返す可能性があることに注意して技術的に正しいman unrandom
です。
「 /dev/ urandomデバイスからの読み取りは、エントロピーの待機をブロックしません。その結果、エントロピープールに十分なエントロピーがない場合、戻り値は、ドライバーが使用するアルゴリズムに対する暗号攻撃に対して理論的に脆弱です。 。これを行う方法の知識は、現在の未分類の文献では利用できませんが、理論的にはそのような攻撃が存在する可能性があります。これがアプリケーションで懸念される場合は、代わりに/ dev/randomを使用してください。」
ただし、 OpenSSLのドキュメントに記載されているように、実際には同じことが当てはまりますopenssl_random_pseudo_bytes
(OpenSSL関数を内部的に呼び出します) 。RAND_pseudo_bytes
"はnum個の疑似ランダムバイトをbufRAND_pseudo_bytes()
に入れます。によって生成される疑似ランダムバイトシーケンスは、十分な長さである場合は一意になりますが、必ずしも予測できないわけではありません。暗号化以外の目的や暗号化プロトコルの特定の目的に使用できます。ただし、通常はキー生成などには使用しません。」RAND_pseudo_bytes()
これらの警告はどちらも、実際にこれらの方法の使用を怖がらせるものではありません。これらの警告が説明する弱点は、特定の不自然な状況(起動直後にハードウェアRNGがないディスクレス組み込みデバイスなど)を除いて、理論上のものであり、そうではありません。 PHPが通常展開されている状況での実際的な懸念事項。
結果として、これらの乱数生成方法はどちらも暗号システムで最も弱いリンクにはならないため、どちらかを安全に選択できます。妄想を感じている場合は、両方を使用することもできます。
追伸 利点の1つopenssl_random_pseudo_bytes
は、Windowsでも機能することです。一方、/dev/urandom
OpenSSL PHP拡張機能がインストールされていない場合でも、Unixで使用できます。したがって、最大限の移植性を得るには、実際に両方のサポートを実装する必要があります。
また、実際に期待した数のバイトを受信したことを常に確認してください。たとえば、/dev/urandom
上記の質問のベースコードは、/dev/urandom
存在しないWindowsなどのシステムで空の文字列をサイレントに返す可能性があります。