0

我知道我们可以window.crypto用来生成一个安全的随机数,但是window.crypto.getRandomValues()使用typedArray. 我想知道我们怎样才能在 JavaScript 中准确地实现这个 Java 函数:

new BigInteger(130, new SecureRandom()).toString(32)
4

1 回答 1

0

您可以生成四个 32 位数字,总共 128 - 接近您的 Java 最大值 130(指定给构造函数的值BigInteger最大位数,如文档中所述),然后将它们全部转换为基数 32 ,最后将它们结合在一起。

function getSecureRandom() {
    // allocate space for four 32-bit numbers
    const randoms = new Uint32Array(4);
    // get random values
    window.crypto.getRandomValues(randoms);
    // convert each number to string in base 32, then join together
    return Array.from(randoms).map(elem => elem.toString(32)).join("");
}

Array#from调用是必要的,因为TypedArray.prototype.map返回另一个TypedArray,并且类型化数组不能包含字符串。我们首先将类型化数组randoms转换为普通数组,然后调用.map()它。

于 2019-09-07T18:47:26.410 回答