web-dev-qa-db-ja.com

crypto#randomBytesはどれくらいランダムですか?

crypto.randomBytes(20).toString('hex')はどれくらいランダムですか?

そのように簡単、私が知る必要があるすべて。

19
Martijn Ebbens

crypto.randomBytes()はどのくらいランダムですか?通常、必要なあらゆる目的に十分なランダム


crypto.randomBytes() 生成暗号的に安全ランダムなデータ:

crypto.randomBytes(size [、callback])

暗号学的に強力な疑似ランダムデータを生成します。 size引数は、生成するバイト数を示す数値です。

これは、ランダムデータが暗号化の目的で使用するのに十分安全であることを意味します。実際、この関数はOpenSSLの Rand_bytes() 関数の周りの 単なるラッパー です。 ドキュメントのこの部分 の状態:

Rand_bytesは、暗号的に強力なランダムバイトをフェッチします。暗号的に強力なバイトは、長期間の鍵生成などの高い整合性のニーズに適しています。ジェネレータがソフトウェアアルゴリズムを使用している場合、バイトは疑似ランダムになります(ただし、暗号的に強力です)。

ハードウェアの乱数ジェネレータがない限り、バイトはpseudo-random —シード値から予測可能に生成されます。シードは OS固有のソース/dev/urandom(UnixライクなシステムではCryptGenRandom、Windowsでは)。 シードが比較的ランダムであり、攻撃者に知られていない限り、生成されるデータは完全にランダムに表示されます。

必要に応じて、説明されているテストを実行できます ここ

2進数の任意のシーケンスが与えられると、統計的手法を使用してそれを調べることが可能です。 NISTのRANDOM NUMBER GENERATIONページから入手できるSTS(Statistical Test Suite)など、さまざまな統計テストのスイートがあります。このスイートは、次のようなさまざまなテストを提供します。

  • 頻度(モノビット)テスト:指定されたシーケンスの0と1の比率が、ほぼ予想どおりかどうかをチェックします
  • 実行テスト:所定のシーケンス内で、長さが異なる連続した同一の数字の実行の数が期待どおりかどうかをテストします
  • ブロック内の1の最長実行:シーケンス内の1の最長実行が期待どおりかどうかを確認します

これは、システム上でyour generatorがどれほどランダムであるかを非常によく示します。ただし、実際にはランダムなソースと実質的に区別できない可能性が高いので、安心してください。ほとんどすべてのアプリケーションに対して十分にランダムである必要があります。

20
Aurora0001