一、什么是使用不安全的隨機(jī)值?
軟件依賴于不可預(yù)測的數(shù)值使用了不充分的隨機(jī)數(shù)導(dǎo)致的安全性降低。
產(chǎn)生原因:計算機(jī)是一種按照既定算法運(yùn)行的機(jī)器,因此不可能產(chǎn)生真正的隨機(jī)性。偽隨機(jī)數(shù)生成器 (PRNG) 近似于隨機(jī)算法,始于一個能計算后續(xù)數(shù)值的種子。
PRNG包括兩種類型: 統(tǒng)計學(xué)的PRNG和 密碼學(xué)的PRNG。
統(tǒng)計學(xué)的PRNG可提供有用的統(tǒng)計資料,但其輸出結(jié)果很容易預(yù)測,因此數(shù)據(jù)流容易復(fù)制。若安全性取決于生成數(shù)值的不可預(yù)測性,則此類型不適用。密碼學(xué)的PRNG通過可產(chǎn)生較難預(yù)測的輸出結(jié)果來應(yīng)對這一問題。為了使加密數(shù)值更為安全,必須使攻擊者根本無法、或極不可能將它與真實的隨機(jī)數(shù)加以區(qū)分。通常情況下,如果并未聲明PRNG算法帶有加密保護(hù),那么它有可能就是一個統(tǒng)計學(xué)的PRNG,不應(yīng)在對安全性要求較高的環(huán)境中使用。
Java API中提供了java.util.Random類實現(xiàn)PRNG(),該P(yáng)RNG是可移植和可重復(fù)的,如果兩個java.util.Random類的實例使用相同的種子,會在所有Java實現(xiàn)中生成相同的數(shù)值序列。
二、使用不安全的隨機(jī)值漏洞構(gòu)成條件有哪些?
滿足一以下條件,就構(gòu)成了一個該類型的安全漏洞:
1、使用存在風(fēng)險的產(chǎn)生隨機(jī)數(shù)方法;
2、使用不可信數(shù)據(jù)作為種子。
三、使用不安全的隨機(jī)值漏洞會造成哪些后果?
關(guān)鍵詞:旁路保護(hù)機(jī)制;獲得特權(quán)或假定身份;其他
可能會導(dǎo)致嚴(yán)重的安全漏洞如易于猜測的密碼、可預(yù)測的加密密鑰、會話劫持攻擊和 DNS 欺騙。
四、使用不安全的隨機(jī)值漏洞的防范和修補(bǔ)方法有哪些?
1、使用目前被業(yè)界專家認(rèn)為較強(qiáng)的經(jīng)過良好審核的加密PRNG算法,初始化隨機(jī)數(shù)生成器時使用具有足夠長度且不固定的種子。
2、在安全性要求較高的應(yīng)用中,應(yīng)使用更安全的隨機(jī)數(shù)生成器,如java.security.SecureRandom類。
Java 語言在 java.security.SecureRandom 中提供了一個加密 PRNG。就像 java.security 中其他以算法為基礎(chǔ)的類那樣,SecureRandom 提供了與某個特定算法集合相關(guān)的包,該包可以獨(dú)立實現(xiàn)。當(dāng)使用 SecureRandom.getInstance() 請求一個 SecureRandom 實例時,您可以申請實現(xiàn)某個特定的算法。如果算法可行,那么您可以將它作為 SecureRandom 的對象使用。如果算法不可行,或者您沒有為算法明確特定的實現(xiàn)方法,那么會由系統(tǒng)為您選擇 SecureRandom 的實現(xiàn)方法。
五、使用不安全的隨機(jī)值漏洞樣例:
用悟空 靜態(tài)代碼檢測工具分析 上述程序代碼,則可以發(fā)現(xiàn)代碼中存在著“使用不安全的隨機(jī)值” 導(dǎo)致的 代碼缺陷 ,
使用不安全的隨機(jī)值在CWE中被編號為CWE-330: Use of Insufficiently Random Values