我使用此函数为每个用户注册时生成唯一的盐(随机字母和数字(。盐碰撞的几率有多大?
// 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 个随机位。 通过生日问题,我们知道您必须产生2**(752/2)
= 2376个值才能有 50% 的几率发生冲突。 生成这么多值是不可能的。
让我们将其降低到更合理的 2128终身碰撞几率。 这意味着您希望生成 256 个随机位,并且意味着您的length
将256/8
= 32。
请注意,上述所有内容都依赖于Random.secure
实际上是一个csPRNG,并且任何攻击者都不知道其任何状态。 鉴于上述概率,这是该系统更大的漏洞。