遅いSecureRandomジェネレータをどのように処理しますか?


165

Javaで暗号的に強力な乱数が必要な場合は、を使用しますSecureRandom。残念ながら、SecureRandom非常に遅くなる可能性があります。/dev/randomLinux で使用する場合、十分なエントロピーが増加するのを待つことをブロックできます。パフォーマンスの低下をどのように回避しますか?

誰かがこの問題の解決策としてアンコモン数学を使用しましたか?

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


これはSecureRandom.generateSeed()の速度低下に関連しているようです。遅さと回避策を説明する欠陥があり拒否されています:JDK-6521844:SecureRandomのハングLinuxシステム上
AlikElzin-kilaka

/ dev / urandom(/ dev / randomではない)を確認してください。ブロックの問題がある場合は、乱数ジェネレータシードをurandomから取得することを検討してください。
jcalfee314 2017

回答:


79

真のランダムデータが必要な場合は、残念ながらそれを待つ必要があります。これには、SecureRandomPRNG のシードが含まれます。Uncommon MathsはSecureRandom、インターネットに接続して特定のWebサイトからシードデータをダウンロードすることはできますが、真のランダムデータをより速く収集することはできません。私の推測では、これが/dev/random利用可能な場所よりも速くなることはほとんどありません。

PRNGが必要な場合は、次のようにします。

SecureRandom.getInstance("SHA1PRNG");

サポートされる文字列はSecureRandomSPIプロバイダーによって異なりますがSecurity.getProviders()、およびを使用して列挙できますProvider.getService()

SunはSHA1PRNGが好きなので、広く利用できます。PRNGは特に高速ではありませんが、PRNGは数値を計算するだけであり、エントロピーの物理的な測定を妨げるものではありません。

例外は、setSeed()データを取得する前に呼び出さない場合、PRNGは最初にnext()またはを呼び出したときに一度シードされますnextBytes()。これは通常、システムからのかなり少量の真のランダムデータを使用してこれを行います。この呼び出しはブロックする可能性がありますが、乱数のソースを「PIDと一緒に現在の時刻をハッシュし、27を加算して、最高のものを期待する」のバリアントよりもはるかに安全になります。ただし、ゲームの乱数だけが必要な場合、または将来、テスト目的で同じシードを使用してストリームを繰り返し可能にしたい場合でも、安全でないシードが役立ちます。


Uncommons Mathsはシードのためにインターネットからデータをダウンロードするだけで、乱数を生成するときにそのランダムデータを返しません。
Dan Dyer、

SecureRandomと同じ-/ dev / urandomはシードのみです。
AviD 2008

うん。質問者が「乱数が必要な場合はSecureRandomを使用します-これは遅い場合があります」と言ったとき、おそらく彼はすべてにgetSeedを使用していて、エントロピープールを排出していると思いました。修正はJDK 6を取得することではなく、意図したとおりにSecureRandomを使用することです;-)
Steve Jessop

@Dan Dyer-Uncommon Mathsに関するコメントを修正しました。私はあなたのページを調べたので、「乱数」によって、「ユーザーに戻ること」ではなく、「その種のために」を意味することがわかりました。しかし、あなたは...私は言っていないことは非常に正しいです
スティーブ・ジェソップ

「それは広く利用可能です」。すべての準拠JDKに含まれていませんか?これは、Javaのセキュリティ標準名...(のリスト上にあるdocs.oracle.com/javase/8/docs/technotes/guides/security/...
ショーン・ライリー

176

Linuxでは、次のコマンドを使用して、より高速ですが少し安全ではない/ dev / urandomを選択できるはずです。

-Djava.security.egd=file:/dev/urandom

ただし、これはJava 5以降では機能しません(Javaバグ6202721)。推奨される回避策は、以下を使用することです。

-Djava.security.egd=file:/dev/./urandom

(余分に注意してください/./


24
Javaバグレポートには「欠陥ではない」と書かれていることに注意してください。つまり、デフォルトはですが/dev/urandom、Sunはこれを魔法の文字列として扱い、/dev/randomとにかく使用するため、偽装する必要があります。ときにあるfile:URLではないfile:URLは?Sunがそうではないと判断した場合はいつでも:-(
ジムギャリソン、

6
これを調査するのに多くの時間を費やしたばかりなので、通常の設定は、java.securityファイルのfile:/dev/urandomin -Djava.security.egdまたはinを使用securerandom.sourceして/dev/random/も、いつでもSecureRandom.getSeed()(またはsetSeed()呼び出されても)読み取られるようです。file:/dev/./urandom結果がまったく読み取ら/dev/randomれないという回避策(straceで確認)
matt b

7
/dev/urandom/dev/random最新のCSPRNGで実装した場合よりも安全性が低くありません:en.wikipedia.org/wiki//dev/random#FreeBSD
lapo

私が心配しているの/dev/urandom/は、それを使用して新しいハードウェアですぐにシークレットを生成した場合に何が起こるかだと思います。/dev/urandom/エントロピーをブロックすべきではありません。デバイスの初回起動時に最初に行うことが公開鍵と秘密鍵のペアの生成である場合など、シークレットが永続的である場合、状況はさらに悪化します。これらの恐ろしい状況以外では、とにかく/dev/urandom一般的なSecureRandomアルゴリズムを使用するよりも良い方法です。
スティーブジェソップ2014年

1
どちらが正しいか ?-Djava.security.egd = file:/ dev /./ urandomまたはfile:/// dev / urandom @mattb
Aarish Ramesh

35

Linuxでは、のデフォルトの実装SecureRandomNativePRNG(ソースコードはここ)で、非常に遅くなる傾向があります。Windowsでは、デフォルトはです。SHA1PRNG他の人が指摘したように、明示的に指定すればLinuxでも使用できます。

NativePRNGSHA1PRNGUncommons MathsのAESCounterRNGとは異なり、オペレーティングシステムからエントロピーを継続的に受信します(から読み取ります/dev/urandom)。他のPRNGは、シード後に追加のエントロピーを取得しません。

AESCounterRNGはの約10倍高速でSHA1PRNG、IIRC自体はの2倍または3倍高速ですNativePRNG

初期化後にエントロピーを取得するより高速なPRNGが必要な場合は、Fortunaの Java実装を見つけることができるかどうかを確認してください。Fortuna実装のコアPRNGはAESCounterRNGで使用されるものと同じですが、エントロピープーリングと自動再シードの高度なシステムもあります。


このリンクは機能していません。uncommons-maths.dev.java.net/nonav/api/org/uncommons/maths/…。これが見えるところはありますか?
UVM

@Unniリンクを更新しました。この回答で述べたパフォーマンスの主張は、もはや有効ではない可能性があることに注意してください。最近のバージョンのJavaでは状況が改善されている可能性があり、プラットフォーム間(つまり、WindowsとLiux)のパフォーマンスに違いがある可能性があります。
Dan Dyer

私はちょうどMessageDigestでSecureRandomの1つの例を実行して、それを16進コード化しました。Windows7 PCでの操作全体で33ミリ秒かかりました。これは問題です。文字列randomNum = new Integer(prng.nextInt()).toString(); MessageDigest sha = MessageDigest.getInstance( "SHA-1"); result = sha.digest(randomNum.getBytes()); str = hexEncode(result);
UVM

24

多くのLinuxディストリビューション(主にDebianベース)は/dev/random、エントロピーに使用するようにOpenJDKを構成しています。

/dev/random 本質的に遅いです(そしてブロックすることさえできます)。

ここから、ブロックを解除する方法について2つのオプションがあります。

  1. エントロピーを改善する、または
  2. ランダム性の要件を減らします。

オプション1、エントロピーを改善する

よりエントロピーを得るに/dev/randomは、hagedgedデーモンを試してください。これは、HAVEGEエントロピーを継続的に収集するデーモンであり、特別なハードウェアを必要とせず、CPUとクロックのみを必要とするため、仮想化環境でも機能します。

Ubuntu / Debianの場合:

apt-get install haveged
update-rc.d haveged defaults
service haveged start

RHEL / CentOSの場合:

yum install haveged
systemctl enable haveged
systemctl start haveged

オプション2.ランダム性の要件を減らす

何らかの理由で上記の解決策が役に立たない場合、または暗号学的に強いランダム性を気にしない場合は、/dev/urandom代わりに切り替えることができます。これにより、ブロックされないことが保証されます。

これをグローバルに行うにjre/lib/security/java.securityは、デフォルトのJavaインストールのファイルを編集して使用します/dev/urandom(別のバグのため、として指定する必要があります/dev/./urandom)。

このような:

#securerandom.source=file:/dev/random
securerandom.source=file:/dev/./urandom

その後、コマンドラインで指定する必要はありません。


注:暗号化を行う場合は、適切なエントロピーが必要です。ポイントのケース- アンドロイドPRNGの問題は、ビットコインの財布のセキュリティを低下させました。


あなたの答えに賛成したが、「本質/dev/random的に遅い(そしてブロックすることさえできる)」は間違っている。それは完全にシステム構成に依存します。新しいマシンが使用できるCPUで例えばA速いRNGを有していてもよく、およびBSDマシンは、一般的に同じ実装を持っている/dev/random/devl/urandom。それでも、必ずしも高速であることに依存 するべきではありません/dev/random。VM上では、クライアントOSのRNGを使用できるように、クライアントVMにクライアントツールセットをインストールすることができます。
Maarten Bodewes

17

SecureRandomヘッドレスDebianサーバーで一度に約25秒間ブロッキングを呼び出すという同様の問題がありました。havegedデーモンがインストールされている/dev/randomので、必要なエントロピーを生成するには、ヘッドレスサーバーでこのようなものが必要です。SecureRandom今の私の呼び出しはおそらくミリ秒かかります。


4
apt-get install havegedそしてupdate-rc.d haveged defaults
Rod Lima

11

本当に「暗号的に強力な」ランダム性が必要な場合は、強力なエントロピーソースが必要です。/dev/randomシステムイベントがエントロピー(ディスクの読み取り、ネットワークパケット、マウスの動き、キーの押下など)を収集するまで待機する必要があるため、処理が遅くなります。

より高速なソリューションは、ハードウェア乱数ジェネレーターです。あなたはすでにあなたのマザーボードに1つを内蔵しているかもしれません。hw_randomのドキュメントを調べて、持っているかどうかを確認する方法とその使用方法を確認してください。rng-toolsパッケージには、ハードウェアで生成されたエントロピーをにフィードするデーモンが含まれています/dev/random

システムでHRNGを使用できず、パフォーマンスのためにエントロピー強度を犠牲にしてもかまわない場合は、からのデータを使用して適切なPRNGをシードし/dev/random、PRNGが作業の大部分を実行するようにします。SP800-90にリストされているNIST承認のPRNG には、実装が簡単なものがいくつかあります 。


良い点ですが、私のコードは商用アプリケーションの一部です。サーバー環境を制御できません。ターゲットサーバーには常にマウスとキーボードがなく、エントロピーを完全にディスクとネットワークI / Oに依存していると思います。これはおそらく根本的な問題です。
デビッドG

3
私は....ので一時的な回避策として、私はちょうど私のマウスの背中を動かし前後に私のテスト走っている間は、/ dev /ランダムはシステムイベントに依存していたことを発見
デヴィッド・K

i820チップセット用の82802ハブは痛々しく遅い(RIP)。あなたはそれから何か有用なものを集めることができて驚いています。オクテットを収集するよりも、ブロックするのに多くの時間を費やしたと思います。
jww

6

Java 8を使用して、Linuxの呼び出しでアルゴリズムSecureRandom.getInstanceStrong()が得られることを発見しましたNativePRNGBlocking。これは、数バイトのソルトを生成するために、数秒間ブロックすることがよくあります。

NativePRNGNonBlocking代わりに明示的に要求するように切り替えましたが、名前から予想されるように、ブロックされなくなりました。これがセキュリティにどのような影響を与えるかはわかりません。おそらく非ブロッキングバージョンでは、使用されるエントロピーの量を保証できません。

更新:わかりましこのすばらしい説明を見つけまし

簡単に言うと、ブロックを回避するには、を使用しますnew SecureRandom()。これは/dev/urandom、ブロックせず、基本的にと同じくらい安全なを使用し/dev/randomます。投稿から:「/ dev / randomを呼び出したいのは、マシンが最初に起動するときだけで、エントロピーはまだ蓄積されていません」。

SecureRandom.getInstanceStrong() 絶対的に最強のRNGを提供しますが、大量のブロッキングが影響しない状況でのみ安全に使用できます。


1
TLS証明書などの長期鍵のみを許可 getInstanceStrong()します。それでもnew SecureRandom()、FIPS準拠のキーペアジェネレーターまたは乱数ジェネレーターを使用したいと思います。つまり、ブロックしない場合 、これは答えを提供します。/dev/urandom結局のところ、結局のところそれは結局のところ、やはりシステムエントロピーに依存しています。しかし、それは一般的に非常に良いアドバイスです。場合/dev/urandomブロックあなたは問題ではなく、Javaアプリケーションのソースを修正する必要があります。
Maarten Bodewes

5

システムに人為的なランダム性を与えるツール(少なくともUbuntuでは)があります。コマンドは単純です:

rngd -r /dev/urandom

前面にsudoが必要な場合があります。rng-toolsパッケージがない場合は、インストールする必要があります。私はこれを試しました、そしてそれは間違いなく私を助けました!

ソース:マットvsワールド


2
システム全体でLinuxカーネルのエントロピーレベルの推定が完全に無効になるため、これはやや危険です。/dev/./urandomを使用したテスト目的(読み取り:アプリのテストスイートを実行しているJenkins)は問題ないと思いますが、本番環境ではそうではありません。
mirabilos 2013

これは実際に私のために働いた唯一の解決策です。Jenkins CIでGradleを使用してAndroidプロジェクトをビルドするときに「不十分なエントロピー」の問題があり、ビルドにパラメーターを渡しても解決しませんでした。
スレーブ、2015

私はキセニアルで組み合わせる必要sudo rngd -r /dev/urandomsudo apt install rng-toolsありました
MrMesees

5

私は同じ問題に直面しました。適切な検索語句でグーグル検索した後、DigitalOceanに関するこの素晴らしい記事を見つけました

hasgedは、セキュリティを犠牲にすることなく、潜在的なソリューションです。

私はここの記事から関連する部分を引用しているだけです。

HAVEGEの原則に基づいており、以前はその関連ライブラリに基づいていたhasgedは、プロセッサでのコード実行時間の変化に基づいてランダム性を生成できます。同じハードウェアの同じ環境でも、1つのコードが同じ時間で実行されるのはほぼ不可能であるため、単一または複数のプログラムを実行するタイミングは、ランダムソースをシードするのに適しています。hasged実装は、ループを繰り返し実行した後、プロセッサーのタイムスタンプカウンター(TSC)の違いを使用して、システムのランダムソース(通常は/ dev / random)をシードします。

havegedのインストール方法

この記事の手順に従ってください。https://www.digitalocean.com/community/tutorials/how-to-setup-additional-entropy-for-cloud-servers-using-haveged

ここに投稿しました


5

あなたが参照した問題/dev/randomは、SecureRandomアルゴリズムではなく、アルゴリズムが使用するランダム性のソースにあります。2つは直交しています。2つのうちどちらがあなたを遅くしているのかを理解する必要があります。

あなたが明示的にリンクした珍しい数学のページは、それらがランダム性の原因を扱っていないことを述べています。

BouncyCastleなどのさまざまなJCEプロバイダーを試して、の実装SecureRandomが速いかどうかを確認できます。

簡単な検索では、デフォルトの実装をFortunaに置き換えるLinuxパッチも明らかになります。これについてはあまり詳しくありませんが、調査を歓迎します。

また、不適切に実装されたSecureRandomアルゴリズムやランダムソースを使用することは非常に危険ですが、独自のJCEプロバイダーをのカスタム実装でロールすることもできますSecureRandomSpi。プロバイダーに署名させるには、Sunとのプロセスを経る必要がありますが、実際には非常に簡単です。暗号化ライブラリに対する米国の輸出制限を知っていることを記載したフォームをFAXで送信する必要があるだけです。


それらの異なるJCEプロバイダーは、エントロピーの別のソースを使用する場合にのみ使用できます。つまり、基本的には、HSMなどの特定のハードウェアを使用する必要があります。それ以外の場合、システムからエントロピーがどれだけ抽出されるかに応じて、速度低下が発生する可能性が高くなります。
Maarten Bodewes

3

安全なランダムを再帰アルゴリズムの初期化ソースとして使用します。UncommonMathでの作業の代わりにMersenneツイスターを使用してバルク作業を行うことができます。

http://en.wikipedia.org/wiki/Mersenne_twister

初期化に使用される安全なランダムをリフレッシュしてください。たとえば、クライアントごとに1つのメルセンヌツイスター擬似ランダムジェネレーターを使用して、クライアントごとに1つの安全なランダムを生成し、十分な高度のランダム化を取得できます。


2
この答えは間違っています。メルセンヌツイスターは安全な乱数ジェネレータではありません。これはにはよいアルゴリズムですRandomが、には適していませんSecureRandom
Maarten Bodewes

3

ドキュメントによると SecureRandomで使用されるさまざまなアルゴリズムは、優先順に次のとおりです。

  • ほとんどの* NIXシステム
    1. NativePRNG
    2. SHA1PRNG
    3. NativePRNGBlocking
    4. NativePRNGNonBlocking
  • Windowsシステムの場合
    1. SHA1PRNG
    2. Windows-PRNG

Linuxについて質問したので、Windowsの実装と、Solarisでのみ実際に利用できるSunPKCS11を無視します。ただし、自分でインストールした場合を除き、これを尋ねることはありません。

それらの同じドキュメントによると、これらのアルゴリズムが使用するものは

SHA1PRNG
初期シードは、現在システム属性とjava.securityエントロピー収集デバイスの組み合わせを介して行われます。

NativePRNGが
nextBytes()使用/dev/urandom
generateSeed()するもの/dev/random

NativePRNGBlocking
nextBytes()generateSeed()使用/dev/random

NativePRNGNonBlocking
nextBytes()generateSeed()使用/dev/urandom

つまり、を使用する場合SecureRandom random = new SecureRandom()、機能するリスト(通常はNativePRNG)が見つかるまでそのリストを検索します。そして、それはそれ自体からシードする/dev/random(または明示的にシードを生成する場合はそれを使用する)ことを意味し/dev/urandom、次のバイト、int、double、booleans、what-have-yousを取得するために使用します。

ので/dev/random(それはエントロピープールに十分なエントロピーを有するまでブロック)をブロックして、その性能を阻害することができます。

その解決策の1つは、十分なエントロピーを生成するために老朽化したもののようなものを使用する/dev/urandomことです。別の解決策は、代わりに使用しています。jvm全体に設定することもできますがSecureRandom、を使用して、のこの特定のインスタンスに設定することをお勧めしますSecureRandom random = SecureRandom.getInstance("NativePRNGNonBlocking")。NativePRNGNonBlockingの場合、このメソッドはNoSuchAlgorithmExceptionをスローする可能性があるため、デフォルトにフォールバックする準備をしてください。

SecureRandom random;
try {
    random = SecureRandom.getInstance("NativePRNGNonBlocking");
} catch (NoSuchAlgorithmException nsae) {
    random = new SecureRandom();
}

また、他の* nixシステムで/dev/urandomは動作が異なる場合があることに注意してください。


ある/dev/urandomランダムに十分な?

従来の知恵は、/dev/random十分にランダムなだけであるということを持っています。ただし、一部の声は異なります。で「使用するSecureRandomための正しい方法」「は/ dev / urandomの程度神話」は、その主張されて/dev/urandom/ちょうど良いようです。

情報セキュリティスタック上のユーザーはこれに同意します。基本的に、質問する必要がある場合/dev/urandomは、目的に応じて問題ありません。


2

私自身はこの問題に直面していませんが、プログラムの開始時にすぐにスレッドを生成し、すぐにシードを生成しようとしてから死にます。ランダムに呼び出すメソッドは、スレッドが生きている場合はそのスレッドに参加するため、最初の呼び出しは、プログラム実行の非常に早い段階で発生した場合にのみブロックされます。


かなり極端なハックですが、うまくいくかもしれません。使用済みのPRNGが、ブロッキングを引き起こす可能性のある追加のシード材料を使用しない可能性があるとは言えません。システムのエントロピーを提供または修正する別の乱数を使用することを強くお勧めします。それは少なくとも一時的な解決策を提供するかもしれないので、それでも私は答えに投票しました。
Maarten Bodewes

2

私の経験は、PRNGの初期化が遅いだけで、その後のランダムデータの生成ではありません。より熱心な初期化戦略を試してください。それらは作成にコストがかかるため、シングルトンのように扱い、同じインスタンスを再利用します。1つのインスタンスに対してスレッドの競合が多すぎる場合は、それらをプールするか、スレッドローカルにします。

乱数生成について妥協しないでください。弱点があると、セキュリティがすべて損なわれます。

COTSの原子崩壊ベースのジェネレータはあまり見かけませんが、ランダムデータが本当に必要な場合のために、いくつかの計画があります。HotBitsを含め、常に注目すべきものが1つあるサイトは、John WalkerのFourmilabです。


1
ハドロンのタウ崩壊生成物がランダム化されたソースの理想にほぼ到達しているので、私はこれについて常に疑問に思っていました。アルゴリズムツールではなく、それを使用したいという私の願望を取り除くことはできません。opの目的のために、私はずっと前に、すべての安全なツールに固有のフロントエンド時間があると決めました。コンストラクターで呼び出すことができるランダマイザーが必要な場合は、ページの読み込み時に作成することを忘れないでください。それはavlスワップインの下に埋もれており、私と同じくらいうるさいので、気付かれることはありません。
ニコラスジョーダン

Intel 8xxチップセット(およびおそらく他の多く)には、熱雑音を使用するハードウェアRNGがあり、これは本当に予測できない量子効果です。Trusted Platform ModuleにはハードウェアRNGを含めることもできますが、残念ながら、私のラップトップにはありません。
エリクソン

一度シードするか、しばらくしてから再シードするかは、特定のRNGに依存します。NISTは再シードするPRNGを指定していますが、多くのソフトウェア実装では指定していません。シングルトンを中心にコードを再構築することは、特にマルチスレッド実装では、ひどい考えです。問題の原因を修正することをお勧めします:エントロピーの欠如による遅い播種。シングルトンを使用する場合は、それを使用して、完全に確定的な他のSecureRandom実装のシードを提供します。ただし、この種の設計にはおそらくかなりの知識が必要です。
Maarten Bodewes 2018

@MaartenBodewesこれらは良い点です。実装がブロックするものであり、システムエントロピーを待機している場合、基盤となるソースは事実上シングルトンであるため、アプリケーションでそれをシングルトンとして扱うことは恐ろしい考えではないと思います。しかし、その1つのインスタンスを使用して他のインスタンスをシードすることは、たとえ複雑であっても、良い提案です。確かではありませんが、Sun(そしてOracle)のプロバイダーSecureRandomは、エントロピー収集において過去10年間に数回変更されたと思います。
エリクソン2018

私はそれがかなりの数回変更されたことを確信しています、それで私はこのコメントにすべての変更を入れようとはしません:)。スローSecureRandomがまだ問題である可能性は低いですが、システムの低いエントロピーが常に問題になります。シングルトンを使用すると、強結合コードが作成されます。これは、設計のアンチパターンです。したがって、細心の注意を払って使用する必要があります。問題を修正する場合は、コード内のすべての参照を逆にする必要があります。
Maarten Bodewes

2

RNG要件について明確にする必要があるようです。(私が理解しているように)最も強力な暗号化RNG要件は、それらを生成するために使用されるアルゴリズムを知っていて、以前に生成されたすべての乱数を知っていても、非現実的な量の計算能力を費やすことなく、将来。

このランダム性の完全な保証が必要ない場合は、おそらく適切なパフォーマンスのトレードオフがあります。Uncommons-MathsまたはFortunaからのAESCounterRNGに関するDan Dyerの応答に同意する傾向があります(その著者の1人は暗号化の専門家であるBruce Schneierです)。私もどちらも使用したことがありませんが、一見するとそのアイデアは評判が良いようです。

私は考えだと思いますが、定期的に初期乱数の種を生成することができればということ(例えば一日一回または時間または何ごと)、あなたがストリーム暗号は、ちょうどそのXORを使用している場合(ストリームの連続した塊から乱数を生成するために、高速ストリーム暗号を使用することができますnullのストリームを渡すか、XORビットを直接取得します)。ECRYPTのeStreamプロジェクトには、パフォーマンスベンチマークを含む多くの優れた情報があります。これは、補充する時点の間のエントロピーを維持しません。そのため、誰かが乱数と使用したアルゴリズムのいずれかを知っている場合、技術的には、大量の計算能力で、ストリーム暗号を解き、将来の乱数を予測できるように、その内部状態を推測します。しかし、そのリスクとその結果がエントロピーを維持するコストを正当化するのに十分であるかどうかを判断する必要があります。

編集:これは、ネットで見つけたRNGの暗号化コースノートで、このトピックに非常に関連しているようです。


1
"Fortuna(その著者の1人は暗号化の専門家であるBruce Schneierです)"-もう1つは暗号化の専門家であるNiels Ferguson :-)
Steve Jessop

2

ハードウェアがサポートしている場合は、私が作成者であるJava RdRandユーティリティ使用してみてください。

これはIntelのRDRAND指示に基づいておりSecureRandom、大容量の実装の場合よりも約10倍高速で、帯域幅の問題はありません。


この実装は、命令を提供するCPUでのみ機能することに注意してください(つまり、rdrandプロセッサフ​​ラグが設定されている場合)。RdRandRandom()コンストラクタを介して明示的にインスタンス化する必要があります。特定のものProviderは実装されていません。


3
people.umass.edu/gbecker/BeckerChes13.pdfを読み、Intel RDRANDデータのみを使用しないようにしてください。aRC4ストリーム暗号(/ dev / urandomからシードされ、出力の最初の数KiBが既知のバイアスのために捨てられる)の出力など、他の予測不可能なデータと常に混合します。
mirabilos 2013

ミラビロス+1。私RDRANDは良い情報源だと思いますが、それは少し信頼できません。それは間違いなく、コレクターへの多数の入力の1つである必要があります(David Johnstonに害はありません)。
jww

私は投票して、リンクを修正し、いくつかの背景情報を提供しました。同意しない場合は、編集をロールバックしてください。
Maarten Bodewes

1

他に確認する必要があるのは、ファイルlib / security / java.securityのプロパティsecurerandom.sourceです。

/ dev / randomではなく/ dev / urandomを使用すると、パフォーマンスが向上する場合があります。乱数の品質が重要な場合は、セキュリティを損なう妥協をしないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.