【问题标题】:Detect fake random numbers?检测假随机数?
【发布时间】:2018-04-05 14:30:25
【问题描述】:

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

例如,'6ea140caa83b485f9c98ebaacfb536ce' 将是一个可以发回的有效 uuid4。

是否有任何方法可以检测或阻止用户发回有效但“用户生成”的 uuid4,例如 'babebabebabe4abebabebabebabebabe'

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

【问题讨论】:

  • 我相信你应该生成你的 UUIDS 服务器端,这就是我们所做的,这可能是你知道你生成什么的最安全的方式。话虽如此,这取决于您的需求,也许有充分的理由说明为什么它是客户端的,但您需要告诉我们更多信息。
  • 为什么不在服务器端生成它们?

标签: security machine-learning cryptography probability uuid


【解决方案1】:

这取决于一点......

没有办法完全确定,但根据您使用的 UUID 版本/子类型,可能有一种方法可以检测至少一些不规则值:

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

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

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

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

【讨论】:

    【解决方案2】:

    没有办法区分用户生成的 UUID 和随机生成的 UUID。

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

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

    40 09 21 fb 54 44 2d 18
    

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

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

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

    所以是的,你当然可以做一些测试,但你永远不能确定:你会把两个误报都当作漏报。

    【讨论】:

    • @DarkSquirrel42 提出了一个很好的观点,即并非 UUID 中的所有数据都需要是随机的。当然,验证非随机位是完全可能的。
    猜你喜欢
    • 2016-11-12
    • 2014-06-02
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多