我需要在Javascript中生成加密安全的伪随机数。我知道window.crypto.getRandomValues
API,它完全符合我的要求。但是,我也知道它是在最近(2011年左右)推出的。
我可以安全地假设window.crypto.getRandomValues
存在,或者使用它会在某些浏览器上引入兼容性问题吗?是否有任何主要(广泛使用)的浏览器不支持window.crypto.getRandomValues
(包括移动或桌面浏览器),如果有,我需要担心哪些?我很高兴得知有足够的支持,我不再需要担心fallback methods,如果情况确实如此。
答案 0 :(得分:21)
我可以安全地假设window.crypto.getRandomValues存在
一如既往,这取决于您的目标市场,并会随着时间的推移而发生变化。 caniuse.com列出了哪些浏览器支持它并计算浏览器市场份额。
以下是摘要:
IE Mobile 11:带前缀
Firefox:21 +
Firefox Mobile:21 +
Safari:来自6.1
Safari Mobile:7.1
Chrome:11 +
Android浏览器:4.4
Opera:15 +
答案 1 :(得分:7)
要获得更完整,最新的视图,最好只检查caniuse.com
:
http://caniuse.com/#feat=getrandomvalues
截至2015年12月,除Opera Mini外,所有现代浏览器都支持它:
答案 2 :(得分:3)
嗨,我刚遇到同样的问题,我知道它已经有一段时间但是这可能对某人有所帮助。 Opera是唯一不支持window.crypto.getRandomValues的,但math.random()
非常安全。
我要解决的问题只是检查window.crypto是否可用,如果没有检查它是否是Opera浏览器,如果不是,则会抛出错误,说明浏览器无法生成安全密码。
if(window.crypto && window.crypto.getRandomValues)
{
(use window.crypto.getRandomValues)
}
else if(isOpera)
{
(use Math.random)
}
else throw new Error("Your browser can not generate a secure Password, please change it to one that can (Google Chrome, IE, Firefox, Safari, Opera) or get the newest update.");
希望它可以帮助某人。
答案 3 :(得分:2)
const crypto = window.crypto ||
window.msCrypto || {
getRandomValues: array => {
for (let i = 0, l = array.length; i < l; i++) {
array[i] = Math.floor(Math.random() * 256);
}
return array;
}
};
if (crypto.getRandomValues === undefined) {
throw new Error("crypto is not supported on this browser");
}