2012-10-04 44 views
3

我有一個基本問題。爲什麼'SHA1PRNG'用於SecureRandom類。如果有人解釋它會很有幫助。提前致謝。在SecureRandom類中使用「SHA1PRNG」

EX: SecureRandom.getInstance(「SHA1PRNG」);

+0

關於SHA1PRNG實現的有趣討論[here](http://stackoverflow.com/questions/19000536/cycle-of-securerandom-of-java)。 –

回答

1

查看關於這個問題的IBM Docs。它只是確保生成的隨機數儘可能接近「真正的隨機數」。易於猜測的隨機數字會破壞加密。

+1

也有趣的是什麼構成'好'的隨機數。閱讀它,但你的頭會爆炸。 –

+0

@TonyEnnis如果這不會引起你的頭,你可以嘗試和了解NIST的測試用例:) –

+0

鏈接被破壞... – assylias

1

SHA1PRNG是一個僞隨機數發生器(名稱中的PRNG)。這意味着它使用SHA1哈希函數來生成一串隨機數。

SHA1哈希函數用於在PRNG中使用之前創建RNG的輸出並散列種子信息。 SHA1PRNG輸出與內部狀態解耦(因此攻擊者無法僅使用RNG的輸出重新創建內部狀態)。

內部狀態相對較大(目前限制爲160位,散列大小,對於Java 1.7中的SHA1PRNG)。這意味着創建週期幾乎是不可能的。如果多次遇到相同的內部狀態,則會創建一個循環 - 以下狀態也會相同(除非使用setSeed()添加了額外的熵)。

PRNG是確定性的。這意味着它們會從相同的輸入素材(種子)生成相同的流。然而,SUN SHA1PRNG將從隨機池第一次訪問時從操作系統檢索到的熵中播種。

的SUN SHA1PRNG的一個特殊性質是它會使用由setSeed()給出的種子如果隨機訪問池之前調用。在這種情況下,流只會依賴於給定的種子和實現的算法;在這種情況下,PRNG是完全確定性的。這在測試過程中很有用,但請不要依賴此屬性的產品代碼。即使SUN SHA1PRNG的實現已經發生了變化,所以你不能依靠輸出在不同的版本上保持不變。

請注意,SHA1PRNG的實現可能因加密提供者而不同。 Android上的代碼特別與SUN SHA1PRNG不同且不太穩定。 請僅使用SecureRandom達到預期目的:生成安全隨機值

相關問題