1. ホーム
  2. java

[解決済み] SecureRandomジェネレータが遅い場合の対処法は?

2022-04-20 14:52:40

質問

Javaで暗号的に強い乱数が欲しい場合は SecureRandom . 残念ながら SecureRandom は非常に遅くなることがあります。もし /dev/random の場合、十分なエントロピーが蓄積されるのを待つためにブロックされることがあります。このパフォーマンス・ペナルティを回避するにはどうすればよいのでしょうか?

を使用された方はいらっしゃいますか? 一般的でない数学 この問題の解決策としては?

このパフォーマンスの問題がJDK 6で解決されたことを確認できる人はいますか?

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

もしあなたが真のランダムデータが欲しいのであれば、残念ながらそれを待つしかありません。これには、シードが SecureRandom PRNGです。Uncommon Mathsは真のランダムデータを集めるのに SecureRandom しかし、インターネットに接続して、特定のウェブサイトからシードデータをダウンロードすることは可能です。私の推測では、これは /dev/random それが利用できるところ。

PRNGを使いたい場合は、以下のようにします。

SecureRandom.getInstance("SHA1PRNG");

どのような文字列がサポートされているかは SecureRandom SPIプロバイダを使用すると、これらのプロバイダを列挙することができます。 Security.getProviders()Provider.getService() .

SunはSHA1PRNGが好きなので、広く利用されています。PRNGとして特別速いわけではありませんが、PRNGは数字を計算するだけで、エントロピーの物理的な計測をブロックするわけではありません。

例外は、もしあなたが setSeed() を最初に呼び出すと、PRNG は自分自身をシードします。 next() または nextBytes() . これは通常、システムからのかなり少量の真のランダムデータを使用して行われます。この呼び出しはブロックされるかもしれませんが、乱数のソースは、PIDと一緒に現在時刻をハッシュし、27を追加し、最善を望みます"の任意のバリエーションよりもはるかに安全になります。ゲーム用の乱数が必要な場合や、テスト用に同じ種を使用して将来的にストリームを再現したい場合、安全でない種はまだ有用です。