字符串生成的UUID是可逆的吗?

时间:2014-11-11 05:23:25

标签: java security uuid

如果我从“种子”字符串生成UUID,如下所示,是否有人可以重新生成原始字符串?

UUID uuid = null;
    try {
        uuid = UUID.nameUUIDFromBytes(("seedString").getBytes("utf8"));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    System.out.println("UUID: " + uuid.toString());

我认为这是不可能的,因为我相信这个人在这里找到:Convert UUID to bytes

但是,我看到每次从某个字符串/字节生成相同的UUID,并且因为它必须是唯一的,所以可以猜到简单的“种子”值?例如,f的UUID是8fa14cdd-754f-31cc-a554-c9e71929cce7,所以如果我看到我知道它是从“f”生成的。

2 个答案:

答案 0 :(得分:3)

由于您通过将字节转换为UUID来获取UUID,并且您始终使用相同的起始字节进行强制转换,因此uuid在多次运行中始终是相同的UUID。

我认为你把随机种子与#34;来自字节"混淆了UUID例程中的方法。它更像是演员而不是种子初始化。即使它像种子初始化一样,用一个恒定的种子进行初始化也只意味着你总是走在同一个"同样的#34;伪随机路径(意思是在走一次之后,你可以知道下一步)。

aug也提出了一个很好的观点,我将在这里详细说明一下。 UUID是一个标识符,由于有很多可供选择,因此被认为是唯一的。但是,如果您创建的例程会重复返回相同的例程,则由于您的选择机制,它不会是唯一的。实际机制并不能保证其独特性;使用保证返回相同值的例程时更是如此。

由于它们不能保证是唯一的(UUID具有固定的位数并且最终所有组合都可以耗尽),可以想象存在比UUID更多的输入(尽管有很多UUID)所以UUID碰撞是不可避免的(即使它理论上需要比宇宙的热死更多的时间)。从实际的角度来看,你可能没有什么可担心的;但是,它仍然可以(微不足道的机会)发生。

这也意味着(理论上)可以保证那里的两个输入可以结束相同的UUID,因此,UUID通常不可逆(但是,在特定(有限)情况下,也许它们可能是可以变得可逆的。)

答案 1 :(得分:1)

有无数个字符串可能会生成给定的UUID,所以即使有人猜到你用来创建给定UUID的字符串,他们也可能永远不会确定。