这个函数产生的盐有多独特?
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,并且任何攻击者都不知道其任何状态。鉴于上述概率,这是该系统更大的漏洞
我使用此功能在每个用户注册时为他们生成唯一的盐(随机字母和数字)。盐发生碰撞的可能性有多大?
// 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,并且任何攻击者都不知道其任何状态。鉴于上述概率,这是该系统更大的漏洞