2013-04-09 59 views
2

我需要/想獲得隨機的(當然,不是全部)的數字,使用密碼的產生。一致的隨機數和平臺

我在做什麼:目前我正在生成他們SecureRandom
我獲得與

SecureRandom sec = SecureRandom.getInstance("SHA1PRNG", "SUN"); 

對象,然後播種它像這樣

sec.setSeed(seed); 

目標:A(優選快)的方法來創建的隨機數,這是加密至少一個安全作爲SHA1PRNG SecureRandom實現。這些需要在不同版本的JRE和Android上相同。

編輯:種子從用戶輸入產生。

問題:隨着SecureRandom.getInstance("SHA1PRNG", "SUN");它不能是這樣的: java.security.NoSuchProviderException: SUN。省略, "SUN"產生隨機數,但是那些比默認(JRE 7)編號不同。

問題:我該如何實現我的目標

你不希望它是可預測的:我想,因爲我需要的可預測性,以便相同的先決條件產生相同的輸出。如果他們是不一樣的,它的不可能做用戶從應用程序所期待的。編輯:通過可預測的我的意思是,當知道單個字節(或一百)你不應該能夠預測下一個,但是當你知道種子,你應該能夠預測第一個(和所有其他)。也許另一個字是可重現

如果有人的更直觀的方式知道,請告訴我!

+0

它們都是可預測的,或者它們不是。如果你希望他們是可預測的,使用相同的種子。但只要共享種子,攻擊者就有辦法獲得它。 – etienne 2013-04-09 15:46:45

+0

種子不共享,我不知道它,只有用戶知道它。所以如果用戶輸入相同的種子,則應該輸出相同的隨機數。 – tilpner 2013-04-09 15:50:50

+0

哦,對。然後嘗試使用'SecureRandom sec = SecureRandom。getInstance(「SHA1PRNG」);'檢查它是否在Android和標準JVM上輸出相同的結果 – etienne 2013-04-09 15:53:58

回答

1

我最終將Sha1Prng與太陽源隔離開來,以確保所有版本的Java和Android的可重複性。我需要刪除一些重要的方法來確保與android的兼容性,因爲android無法訪問nio類...

0

我推薦使用UUID.randomUUID(),然後將其拆分爲使用getLeastSignificantBits()getMostSignificantBits多頭和()

+1

這不是我所需要的。有(或者我沒有看到過)沒有辦法讓它輸出相同的,多次。 – tilpner 2013-04-09 15:49:37

0

如果你想預測的,他們是不是隨機的。這打破了「安全」的「目標」要求,並轉化爲兩臺服務器之間簡單的共享密鑰。

你可以得到一些看似隨機的東西,但是通過使用素數整數的特性,你可以用I(某個特定的整數)開始構建一組整數,然後添加第一個素數,然後用第二個素數。 (事實上​​,第一和第二號只需要相對黃金 - 這意味着它們沒有共同的首要因素 - 不包括1,如果你把那個叫因素

如果重複添加和做的過程中。模數,你將得到一組數字,你可以重複地複製它們,並且按照獲取集合中的任何成員,加上第一個素數並在第二個素數上進行模數的意義排序,你總會得到相同的結果。

最後,如果第一個素數相對於第二個素數很大,那麼該序列不容易被人類預測,並且似乎是隨機的。

例如,第一次素= 7,第2個黃金= 5(請注意,這說明它是如何工作的,但不是很有用在現實生活中)

開始2.添加7得到9模5得到4. 4加7 = 11。模5 = 1.

序列是2,4,1,3,0,然後它重複。

現在生成的數字似乎是隨機的。相對質數是91193和65536(我選擇了第二之一,因爲它是2的冪這樣所有模的ED 50值可以容納16位。)

int first = 91193; 
int modByLogicalAnd = 0xFFFF; 

int nonRandomNumber = 2345; // Use something else 
for (int i = 0; i < 1000 ; ++i) { 
    nonRandomNumber += first; 
    nonRandomNumber &= modByLogicalAnd; 
    // print it here 
} 

每次迭代生成2個字節排序的隨機數字。如果你需要更大的隨機「字符串」,你可以將它們中的幾個放入緩衝區。

而且它們是可重複的。你的用戶可以選擇起點,你可以使用任何你想要的素數(或者,實際上,任何沒有2的數字作爲因素)。

BTW - 使用2的冪作爲第二個數字使其更具可預測性。

+0

我編輯了我的帖子:種子是根據用戶輸入生成的。另外:我懷疑這與SHA1PRNG一樣是密碼安全的。它可能是不可預測的,猜測從一個字節到下一個,但第一個字節應該是可預知的,當你知道種子... – tilpner 2013-04-09 16:01:08

+0

我會保持,你可能會不同意,你想要它可重複的方式使「密碼安全「最好的幻覺。 – 2013-04-09 16:05:14

+0

讓我們稱之爲「可重複」,而不是「重複」。 – tilpner 2013-04-09 16:30:46

0

忽略使用某些物理輸入(隨機時鐘位,電噪聲等)的RNG,在給定相同的啓動條件下,所有軟件RNG都是可預測的。畢竟,(希望)是確定性的計算機程序。

爲了防止可預測性,有些算法有意地包含物理輸入(例如,通過偶爾採樣計算機時鐘),但這些(據我所知)是例外。因此,任何「常規」的RNG,如果採用相同的種子並按照相同的規範實施,應該產生相同的「隨機」數字序列。 (這就是爲什麼一計算機RNG被更恰當地稱爲「僞隨機數發生器」。)

,一個RNG可以與先前使用的種子播種並再現數字的「已知的」序列的事實不會使RNG的安全性低於您以某種方式阻止它播種的安全性(雖然它可能不如其間隔播種的花式算法更安全)。而做到這一點的能力 - 一次又一次地重現相同的序列不僅在測試中非常有用,而且在加密和其他安全應用程序中有一些「真實生活」的應用程序。 (實際上,加密算法本質上只是一個可重複的隨機數生成器。)

+0

這應該是一個答案嗎? (不想聽起來很愚蠢,但這些對我來說都不是新鮮事物,它也不會幫助我解決問題)如何將您的評論添加到本文中? – tilpner 2013-04-09 16:28:33

+0

@StackOverflowException - 基本上它只是一個評論太長而不適合評論。 – 2013-04-09 16:29:49

+0

對不起,在閱讀本評論後,我閱讀了您的評論。 – tilpner 2013-04-09 16:31:32