加密安全的伪随机数生成器是否也保证以这样一种方式收集熵,即在不同时间生成该值时不会出现两次?
我知道这已经不太可能了,但是有具体的保证吗?
我需要从一个不能有冲突的 CSPRNG 生成一系列唯一 ID。
加密安全的伪随机数生成器是否也保证以这样一种方式收集熵,即在不同时间生成该值时不会出现两次?
我知道这已经不太可能了,但是有具体的保证吗?
我需要从一个不能有冲突的 CSPRNG 生成一系列唯一 ID。
理想的 (CS)PRNG 可确保提取某个值的概率是恒定的,并且不会随时间变化,无论该值是否在过去已经输出。
例如,假设您的 ID 是 32 位长,今天您提取0x12345678
. 刚刚发生的事情的概率是1/(2^32)
。
明天(以及将来的任何时候),您仍然有相同的概率1/(2^32)
提取 value 0x12345678
。
然而,生日悖论告诉我们,如果您生成 65 536 (=2^(32/2)) 个值,则两个 ID 相同的概率为50% 。
换句话说,没有硬性保证 CSPRNG 的输出不会相同。机会是否足够小很大程度上取决于您的 ID 有多长以及您希望在系统的整个生命周期内总共拥有多少个 ID(当攻击者可以随意生成 ID 时,应特别注意安全问题)。
为了完整起见,所有这些都适用于任何好的 PRNG - 包括最简单的硬币翻转。Cryptographically Strong PRNGs具有额外的属性,例如从任何给定输出预测未来或过去输出的复杂性(应该很难)、从状态妥协中恢复的能力以及提供熵的能力。