确保在这里使用这个伪随机数生成器是安全的

3gw*_*ain 12 javascript sonarqube ecmascript-2016

当我声明一个变量时,例如:

const FileId = Math.random().toString(36).substr(2, 9);
Run Code Online (Sandbox Code Playgroud)

我在声纳中收到此错误:

确保在这里使用这个伪随机数生成器是安全的。

我应该如何解决这个问题?我的代码有什么问题吗?

谁能帮我?

mpl*_*jan 14

他们想提醒您这样一个事实:Math.random 不是真正的随机生成器,而是PRNG。如果您需要它的安全性,您需要CSPRNG

这是规格

使用伪随机数生成器 (PRNG) 是安全敏感的

当软件在需要不可预测性的上下文中生成可预测值时,攻击者可能会猜测将生成的下一个值,并使用此猜测来冒充其他用户或访问敏感信息。

由于 Math.random() 函数依赖于弱伪随机数生成器,因此该函数不应用于安全关键型应用程序或保护敏感数据。在这种情况下,应使用加密强伪随机数生成器 (CSPRNG)。

问问自己是否

  • 使用生成值的代码要求它是不可预测的。所有加密机制或秘密值(例如密码)被散列时都是这种情况。
  • 您使用的函数生成一个可以预测的值(伪随机)。
  • 生成的值被多次使用。
  • 攻击者可以访问生成的值。

如果您对第一个问题和以下任何一个问题的回答是“是”,您就会面临风险。

代码示例

const crypto = window.crypto || window.msCrypto;
var array = new Uint32Array(1);
crypto.getRandomValues(array); // Compliant for security-sensitive use cases
const FileId = array[0];
console.log(FileId);
Run Code Online (Sandbox Code Playgroud)