检测假随机数?

Detect fake random numbers?

我的客户端代码生成 UUID 并将它们发送到服务器。

例如,'6ea140caa83b485f9c98ebaacfb536ce' 将是要发回的有效 uuid4。

有什么方法可以检测或阻止用户发回有效但 "user generated" 的 uuid4,例如 'babebabebabe4abebabebabebabebabe'

例如,防止其中某些 class 的一种方法是查看数字的二进制表示形式中 0 和 1 的出现次数。这可能适用于像 '00000000000040000000000000000000' 这样的字符串,但不适用于所有字符串。

不,无法区分用户生成的 UUID 和随机生成的 UUID。

首先,用户生成的 UUID 也可能是部分随机的。但让我们假设它不是。

在这种情况下,您想要检测一种模式。但是,尽管您给出了一个模式示例,但模式几乎可以是任何东西。例如,下面的字节数组看起来完全是随机的,对吧?

40 09 21 fb 54 44 2d 18

但实际上它是一个 nothing-up-my-sleeve 数字 通常在密码社区中使用:它只是 Pi 的编码(在本例中为 64 位浮点数,因为我有点懒)。

肯定有随机性测试,比如FIPS随机数测试。这些需要非常多的输入才能查看是失败还是成功。即便如此:它仅表明随机数生成器确实获得了某些统计特性。 Pi的编码很可能会成功。

令人恼火的是,随机数生成器完全有可能生成看起来一点也不随机的位串,如果只是偶然的话。位串越小,随机数生成器生成看起来根本不是随机的东西的机会就越大。而且 UUID 并没有那么大。

所以是的,你当然可以做一些测试,但你永远无法确定:你将同时拥有假阳性和假阴性。

这有点取决于...

无法完全确定,但根据您使用的 UUID version/subtype,可能有一种方法可以检测至少一些不规则值:

https://www.rfc-editor.org/rfc/rfc4122#section-4.1 定义了 UUID 的原始版本 1,以及 uuid 字段的布局 ...

例如,您可以检查版本和变体字段是否有效...

如果你的 UUID 生成实际上使用版本 1,除了第一次测试版本和变体之外,你还可以测试时间戳是否在有效范围内......例如,UUID 可能不太可能在问题产生于 1600 年...或未来

所以可以应用类似的测试来检查该值是否真的有意义,或者完全是乱码......它不能保护你免受有人思考:好的......让我们分析一下并提供一个手动选择的值满足所有条件