gpt4 book ai didi

javascript - 加密安全数组随机播放

转载 作者:搜寻专家 更新时间:2023-10-31 22:51:19 25 4
gpt4 key购买 nike

我正在尝试使用加密安全的熵源对数组进行洗牌。

我在此处发现了一个类似的问题,关于改组数组 How to randomize (shuffle) a JavaScript array? .然而,几乎所有的解决方案都使用了 Math.random,这是不安全的。不幸的是,我没有对这个问题发表评论/发表评论的名誉。

这是我想出的解决方案,它使用 Durstenfeld 混洗与 CSPRNG 配对来生成给定范围内的随机整数(由 random-number-csprng 库提供)。

const randomNumber = require("random-number-csprng");

async function secureShuffleArray(array) {
for (let i = array.length - 1; i > 0; i--) {
const j = await randomNumber(0, i);
const temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}

此实现是否正确且公正?

注意事项:

  • 为了我的目的,数组最多包含 ~100 个元素
  • 运行 nodejs v6.10.3 LTS(转译)

最佳答案

经过广泛审查后,我得出结论认为该解决方案是正确的,它是 Durstenfeld 洗牌的逐字实现。

但是,Durstenfeld/Fisher-Yates 洗牌的随机性取决于它的 RNG 来源。我的解决方案取决于 random-number-csprng CSPRNG 库,它使用 crypto.randomBytesAsync,因此在大多数情况下都是加密安全的(请参阅 How random is crypto#randomBytes?)。

更新:我在此处发布了此解决方案的功能等效但更高效的版本 crypto-secure-shuffle ,也可以作为 npm 包使用。下面是相关的实现:

const secureRandomInRange = require("random-number-csprng");

async function secureShuffle(array) {
const promises = [];

// asynchronously generate an array of random numbers using a CSPRNG
for (let i = array.length - 1; i > 0; i--) {
promises.push(secureRandomInRange(0, i));
}

const randomNumbers = await Promise.all(promises);

// apply durstenfeld shuffle with previously generated random numbers
for (let i = array.length - 1; i > 0; i--) {
const j = randomNumbers[array.length - i - 1];
const temp = array[i];
array[i] = array[j];
array[j] = temp;
}

return array;
}

关于javascript - 加密安全数组随机播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49003363/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com