我需要生成密码安全伪随机数,在Javascript。 我了解window.crypto.getRandomValues
API,这不正是我想要的。 不过,我也知道这是推出相对较晚(2011年左右)。
我可以安全地假定window.crypto.getRandomValues
存在,还是会使用它引入的一些浏览器的兼容性问题? 是否有不支持任何重大的(广泛使用)的浏览器window.crypto.getRandomValues
(包括移动和桌面浏览器),如果是这样,哪些我需要担心? 我会很高兴地得知,有足够的支持,我不再需要担心的后备方法 ,如果情况确实如此。
我可以安全地假定window.crypto.getRandomValues存在
一如往常这取决于你的目标市场,并会随时间而改变。 caniuse.com列出了浏览器都支持它,并计算浏览器的市场份额。
这是一个总结:
- IE 11:W /前缀
IE移动11:W /前缀
火狐:21+
Firefox移动:21+
Safari浏览器:6.1
Safari浏览器手机:7.1
铬:11+
- 移动版Chrome浏览:23+
Android浏览器:4.4
歌剧:15+
- Opera移动:36+
- Opera Mini的:无
为了更完整,最新的观点,它可能会更好,只是检查caniuse.com
:
http://caniuse.com/#feat=getrandomvalues
截至2015年12月,所有现代浏览器,除了Opera Mini的,支持它:
您好我刚刚有同样的问题,我知道它已经有一段时间,但仍可能帮助别人。 Opera是不支持window.crypto.getRandomValues唯一的一个,但它math.random()
是相当安全的。
我做了什么来解决这个只是为了检查window.crypto是缴费,如果不检查是Opera浏览器,如果没有yust抛出一个错误,指出该浏览器无法产生一个安全的密码。
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.");
希望它可以帮助别人。
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");
}