2012-03-10 54 views
1

我在我的android客戶端以及服務器(Servlet)中得到一個隨機數。我在客戶端和服務器端都使用相同的SecureRandom算法(「SHA1PRNG」)。我的種子價值都相同。但是我得到的輸出數字在客戶端和服務器端都是不同的。這可能是什麼原因呢?這裏是我的代碼:算法在SecureRandom號碼

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中使用了安全的randon數生成器,並使用相同的種子實例兩次,我得到了相同的隨機數兩次。當我在Servlet中做同樣的事情時,我得到了兩個相同的隨機數字,用於兩個相同的種子。但問題是隨機數** Android不等於servlet中的隨機數** – suraj 2012-03-12 04:52:40

+1

在Android平臺和您的servlet使用的JDK上的實現可能略有不同。但我的觀點仍然是:使用一個類,通過契約,應該儘可能安全地生成數字,以便在幾個不同的平臺上獲得可預測的數字序列,這不是一個好主意。嘗試使用自己的算法,通過契約,生成一個給定種子的可預測序列,或者在一側生成數字,並與另一側分享它們。 – 2012-03-12 08:02:37

+0

好的。我會考慮它。非常感謝。你真棒 – suraj 2012-03-12 08:34:27

0

讓我在4年後投入2美分。

SecureRandom實際上是依賴於系統的,這意味着生成數據的方式是特定於操作系統的。操作系統本身提供了一個接口來獲得熵(它可能甚至是你剛剛移動鼠標的方式)。這就是你得到不同結果的原因。