1

我正在尝试使用 JavaScript 创建一个指数随机数生成器,它使用以前StackOverflow答案中的方法工作。:

function randomNumGen() {
        var u = Math.random();
        var mu = 0.3;
        return -Math.log(1.0 - u) / mu;
}

但是,我后来发现 using在另一个StackOverflow答案Math.random()中并不是加密安全的。但是,我不完全确定它在我的情况下是否是加密安全的,因为它使用针对指数分布的均匀随机性来制作样本,但我认为它不安全。u

在第二个站点中,它推荐了其他库,但是它们使用不同的分布,而不是指数分布。我想我不能简单地Math.random()用他们的替换(例如window.crypto.getRandomValues),因为它不是统一的。

关于我能做什么的任何见解?

4

1 回答 1

2

,所提出的指数分布采样器在密码学上是不安全的。JavaScriptMath.random()在密码学上是不安全的,您用于对分布进行采样的逆变换方法不会改变这一事实。

虽然我不清楚为什么你真的想使用加密安全的随机源,但如果你愿意,你可以。

但是,您可能对这些术语感到困惑。你真的需要大量的不可预测性来实现加密目的,还是仅仅需要大量的统计随机性?

如果您确实需要加密安全性,请使用转换为浮点区间 [0, 1)的CSPRNGMath.random()而不是,否则您应该可以使用简单的高质量PRNG

于 2017-05-27T12:45:22.147 回答