可以用生成具有相同参数的数字的CSPRNG替换Math.random吗?

时间:2019-07-12 20:38:32

标签: javascript random cryptography

我想用加密安全的随机数生成器代替Math.random函数。

生成器的输出必须从0(包括)到1(不包括),以与原始Math.random保持一致,因此可以将其放到任何项目中而不会引起错误

1 个答案:

答案 0 :(得分:1)

类似这样的函数可以解决问题:

Math.random = function (inclusive) {
   let typedArray = new Uint32Array(1);
   let randomNumber = (crypto || msCrypto).getRandomValues(typedArray)[0];
   let integerLimit = Math.pow(2, 32); inclusive && (integerLimit -= 1);
   return randomNumber / integerLimit;
}

来源:For a more secure implementation...

说明:值randomNumber是32位整数。 32位整数限制为2^32 - 1,因此将输出数除以32位整数限制(加1)将得到从0(含)到1(独占),就像Math.random

inclusive变量(如果设置为true)将增加输出范围,以包括1

编辑1:添加了对IE 11的支持。

编辑2:添加了一个选项,可将1包括在输出范围内。