这个函数产生的盐有多独特?

How unique is the salt produced by this function?

我使用此功能在每个用户注册时为他们生成唯一的盐(随机字母和数字)。盐发生碰撞的可能性有多大?

  // length is for the underlying bytes, not the resulting string.
  String generateSalt([int length = 94]) {
    final Random random = Random.secure();
    var values = List<int>.generate(length, (i) => random.nextInt(256));
    return base64Url.encode(values);
  }

初步估计它们不会发生碰撞!事实上,我建议将 length 变小,这样你就不会潜在地揭示 RNG

的熵

您的算法当前生成 log2(256**94) = 8*94 = 752 个随机位。通过 birthday problem we know that you'd have to produce 2**(752/2) = 2376 values to have a 50% chance of collision. generating this many values is impossible.

让我们将其降低到更合理的 2128 生命周期碰撞几率。这意味着您需要生成 256 个随机位,并且意味着您的 length 将是 256/8 = 32.

请注意,以上所有内容都依赖于 Random.secure 实际上是一个 csPRNG,并且任何攻击者都不知道其任何状态。鉴于上述概率,这是该系统更大的漏洞