代码之家  ›  专栏  ›  技术社区  ›  raphaelrk

检测假随机数?

  •  -1
  • raphaelrk  · 技术社区  · 6 年前

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

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

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

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Community CDub    3 年前

    这取决于一点。。。

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

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

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

    如果您的UUID生成实际上使用的是版本1,那么除了对版本和变体进行第一次测试外,您还可以测试时间戳是否在有效范围内。。。例如,所讨论的UUID不太可能在1600年生成。。。或者在将来

    所以,像这样的测试可以用来检查这个值是否真的有意义,或者是完全胡说八道。。。它不能保护你不让别人想:好吧。。。让我们对此进行分析,并提供满足所有条件的手动选择值

        2
  •  1
  •   Maarten Bodewes    6 年前

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

    首先,用户生成的UUID也可能是部分随机的。但让我们假设事实并非如此。

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

    40 09 21 fb 54 44 2d 18
    

    但实际上它是 我袖子里没什么数字 通常在加密社区中使用:它只是Pi的编码(在本例中为64位浮点,因为我有点懒惰)。

    当然也有随机性测试,例如FIPS随机数测试。这些需要大量的输入,以查看某个操作是否失败或成功。即使如此:它也只能表明某些统计特性确实是由随机数生成器获得的。Pi的编码很可能会成功。

    令人烦恼的是,随机数生成器完全可以生成位字符串 看起来一点都不随机 ,如果只是偶然的话。位字符串越小,随机数生成器生成看起来一点都不随机的内容的可能性就越大。UUID也没那么大。

    所以,是的,当然你可以做一些测试,但你永远不能确定:你将有两个假阳性作为假阴性。