Linuxの場合、私はmkpasswd
を使用してOS Xで使用するランダムなパスワードを生成するのに慣れていますが、このコマンドはありません。毎回私のvpsにsshingするのではなく、Javaを使って実装し直したかったのです。私がしたことは、ランダムに4つの小文字、2つの大文字、2つの記号(/など)と2つの数字を選ぶことです。それから私はベクトルを作成し、それをシャッフルします。mkpasswdの再実装
これは十分にランダム化されていると思いますか?
Linuxの場合、私はmkpasswd
を使用してOS Xで使用するランダムなパスワードを生成するのに慣れていますが、このコマンドはありません。毎回私のvpsにsshingするのではなく、Javaを使って実装し直したかったのです。私がしたことは、ランダムに4つの小文字、2つの大文字、2つの記号(/など)と2つの数字を選ぶことです。それから私はベクトルを作成し、それをシャッフルします。mkpasswdの再実装
これは十分にランダム化されていると思いますか?
はい、そうです。 java.util.Random:
このクラスのインスタンスは、擬似乱数のストリームを生成するために使用されます。このクラスでは、線形合同式を使用して修正された48ビットのシードが使用されます。
クラスランダムによって実装されるアルゴリズムは、各呼び出しで最大32個の擬似ランダム生成ビットを供給できる保護されたユーティリティメソッドを使用します。コメントへの応答で
EDIT
:
/**
* Creates a new random number generator. This constructor sets
* the seed of the random number generator to a value very likely
* to be distinct from any other invocation of this constructor.
*/
public Random() {
this(++seedUniquifier + System.nanoTime());
}
private static volatile long seedUniquifier = 8682522807148012L;
エントロピーがどこから来るかによって異なります。あなたの特定の言語に付属しているrand()または類似の関数を使用すると、安全でない可能性があります。
OSXでは/ dev/randomを使用できます。
それはOKかもしれませんが、パスワードでいくつかのランダム化は、おそらく長許可する必要があります。
プログラムが普及すれば、パスワードの長さが一般に知られている弱点になります。また、小文字の正確な比率をランダムにする:大文字:記号:数字は少しです。
私はそれらをランダム化します。私はちょうどオプションを生成せずにmkpasswdをコピーしていました。 –
あなたのOS Xホストでmkpasswdをコンパイルするだけではどうですか?
Mac Portsには、同様のpwgen
コマンドがあります。
java.util.Randomの代わりにjava.security.SecureRandomを使用すると、おそらく安全です。 SecureRandomは、「暗号的に強力な疑似乱数ジェネレータ(PRNG)」を提供します。私。それは、種子が容易に推測できず、生成された数が高いエントロピーを有することを保証する。
私はどこかでそれを掘り下げました:... SecureRandomのシード自体を内部的な乱雑さから守りましょう。デフォルトでは、これはMac OS X上のデバイス/ dev/randomに設定されています。 – Inshallah
そして種はどこから来ますか? :) – Inshallah
競合は起こりそうにないかもしれませんが、安全にしません。誰かがSystem.nanoTime()の値を推測できる場合、ジェネレータがシードされている時点で、どのパスワードが生成されているかを知ることができます。それは本当の問題です。私はあなたがjava.util.Randomをそのまま使うことはできないと思っています。例えば、/ dev/randomのようなもっと予測できないソースからシードを取得しなければなりません。 – Inshallah
あなたは正しいです:-) – dfa