前端項(xiàng)目在安全漏洞掃描的時(shí)候,爆出了客戶端不安全隨機(jī)數(shù)的問題,看了下代碼是因?yàn)槭褂昧?Math.random() 生成隨機(jī)數(shù)造成的。
百度了一下,math.random()并不是真的隨機(jī)數(shù),而是偽隨機(jī)數(shù)!
原因
Math.random() 函數(shù)是 JavaScript 內(nèi)置的一個(gè)函數(shù),它用于生成一個(gè) 0 到 1(包括0,不包括1) 之間的偽隨機(jī)數(shù)。這個(gè)函數(shù)的實(shí)現(xiàn)依賴于瀏覽器或 JavaScript 引擎,不同的瀏覽器或引擎可能會(huì)使用不同的算法來實(shí)現(xiàn)這個(gè)函數(shù)。
通常情況下,Math.random() 函數(shù)會(huì)使用一種偽隨機(jī)數(shù)生成器來生成隨機(jī)數(shù)。這種生成器通常會(huì)使用一個(gè)初始值(稱為種子)來生成一系列看起來隨機(jī)的數(shù)字。為了使生成的數(shù)字更加不可預(yù)測(cè),Math.random() 函數(shù)可能會(huì)使用外部數(shù)據(jù)(如當(dāng)前時(shí)間)作為種子值。
由于 Math.random() 函數(shù)的實(shí)現(xiàn)依賴于瀏覽器或引擎,因此它產(chǎn)生的隨機(jī)數(shù)質(zhì)量也會(huì)受到影響。一些瀏覽器可能會(huì)使用線性同余生成器算法來實(shí)現(xiàn),而另一些瀏覽器則可能會(huì)使用梅森旋轉(zhuǎn)算法。
也就是說在有些業(yè)務(wù)場(chǎng)景中,這個(gè)方法做不到真正意義上的隨機(jī),也就算一個(gè)漏洞,接下來就想辦法解決掉他。文章來源:http://www.zghlxwxcb.cn/news/detail-563953.html
解決方案
window.crypto.getRandomValues(new Uint8Array(1)) * 1
獲取符合密碼學(xué)要求的安全的隨機(jī)值
注意此方法生成的是0-255之間(包括)的隨機(jī)數(shù),所以要想得到0-1的隨機(jī)數(shù)需要乘以比 0.0039215686274509802小的值,當(dāng)然也可以簡寫成0.0039,計(jì)算辦法就是1000/255了。文章來源地址http://www.zghlxwxcb.cn/news/detail-563953.html
到了這里,關(guān)于前端解決客戶端不安全隨機(jī)數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!