我有一個基本問題。爲什麼'SHA1PRNG'用於SecureRandom類。如果有人解釋它會很有幫助。提前致謝。在SecureRandom類中使用「SHA1PRNG」
EX: SecureRandom.getInstance(「SHA1PRNG」);
我有一個基本問題。爲什麼'SHA1PRNG'用於SecureRandom類。如果有人解釋它會很有幫助。提前致謝。在SecureRandom類中使用「SHA1PRNG」
EX: SecureRandom.getInstance(「SHA1PRNG」);
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
達到預期目的:生成安全隨機值。
關於SHA1PRNG實現的有趣討論[here](http://stackoverflow.com/questions/19000536/cycle-of-securerandom-of-java)。 –