どのような状況でノードのcrypto.pseudoRandomBytes
暗号的に強力なcrypto.randomBytes
?
(正しくない) ですが、ドキュメントでは、それがどれほど強力でないかについてはあまり言及されていません。pseudoRandomBytes
予測可能性を犠牲にしてパフォーマンスが向上すると 想定しています
pseudoRandomBytes
具体的には、 CSRF トークンを生成するために を使用しても問題ないかどうか疑問に思っています。
ベストアンサー1
それが判明したとして、デフォルトのOpenSSL(これはノードにバンドルされていますが、自分で構築した場合は、さまざまなエンジンを構成する)、ランダムデータを生成するアルゴリズムrandomBytes
(RAND_bytes
)とpseudoRandomBytes
( )の両方でまったく同じですRAND_pseudo_bytes
。
2 つの呼び出しの唯一の違いは、使用しているノードのバージョンによって異なります。
- node v0.12 以前では、
randomBytes
エントロピー プールに十分なデータがまだシードされていない場合はエラーを返します。pseudoRandomBytes
エントロピー プールが適切にシードされていない場合でも、常にバイトを返します。 - ノード v4 以降では、
randomBytes
エントロピー プールに十分なデータが格納されるまで戻りません。これには数ミリ秒しかかかりません (システムが起動した直後でない限り)。
エントロピープールに十分なデータが投入されると、それが「枯渇」することは決してないので、randomBytes
との間には実質的な違いはまったくありません。pseudoRandomBytes
エントロピープールがいっぱいになると。
ランダム データの生成にまったく同じアルゴリズムが使用されるため、2 つの呼び出し間でパフォーマンスに違いはありません (1 回限りのエントロピー プール シーディングを除く)。