2012-03-10 7 views
1

My AndroidクライアントとServer(Servlet)で乱数を取得しています。私はクライアントとサーバーの両方で同じSecureRandomアルゴリズム( "SHA1PRNG")を使用しています。私のシード値は両方で同じです。しかし、私が得ている出力番号は、クライアントとサーバーの両方で異なっています。それの理由は何でしょうか?ここに私のコードは次のとおりです。SecureRandom numberのアルゴリズム

SecureRandom random = new SecureRandom(); 
try { 
    random.getInstance("SHA1PRNG"); 
} catch (Exception e) { 
    // ... 
} 
; 
random.setSeed(1097327); 
byte[] b1 = new byte[3]; 
random.nextBytes(b1); 
long value = 0; 
for (int i = 0; i < b1.length; i++) { 
    value += (b1[i] & 0xff) << (8 * i); 
    Toast.makeText(getApplicationContext(), Long.toString(value), 
      Toast.LENGTH_LONG).show(); 
} 

答えて

2

のSecureRandomのJavadocは言う:

多くのSecureRandomの実装では、彼らは決定論を使用することを意味擬似ランダム 数発生器(PRNG)の形態である アルゴリズムを使用して、真のランダムシードから擬似ランダムシーケンスを生成する。 他の実装では、真の乱数が生成される場合がありますが、 の場合、両方の手法を組み合わせて使用​​できます。

おそらく、アルゴリズムは乱数を生成するために別の乱数発生源を使用します。そうすることで、SecureRandomクラスのコントラクトが破られることはありません。安全なランダムジェネレータの目的は乱数を生成することであり、予測可能な数列ではないため、さらにそれを満たすことさえあります。

+0

Androidでセキュアなランドン番号ジェネレータを使用していますが、同じシードインスタンスを2回使用すると、同じランダム番号が2回表示されます。私がサーブレットで同じことをしたとき、私は2つの同じ種子に対して2つの等しい乱数を得ました。しかし問題は乱数です** Androidはサーブレットの乱数と等しくありません** – suraj

+1

Androidプラットフォームとサーブレットで使用されるJDKの実装は多少異なるでしょう。しかし、私の主張は残っています。いくつかの異なるプラットフォームで予測可能なシーケンスを得るために、契約によって、できるだけ安全にランダムに数値を生成することになっているクラスを使用することは良い考えではありません。契約によって、シードが与えられた予測可能なシーケンスを生成する、または一方の側で数値を生成し、他方の側でそれらを共有する、独自のアルゴリズムを使用してみてください。 –

+0

よろしいですか。私はそれを考慮します。ありがとう。あなたはちょうど素晴らしい – suraj

0

4年後に私の2セントを入れてみましょう。

SecureRandomは実際にはシステムに依存します。つまり、データの生成方法はOS固有のものです。 OS自体は、エントロピーを取得するためのインターフェイスを提供します(マウスを動かすだけの方法かもしれません)。それが異なる結果をもたらす理由です。