Java随机UUID是否可预测?

ant*_*lma 40 java security random uuid

我想对数据库中的敏感数据使用加密安全主键 - 这是无法猜测/可预测的,并且它不能由数据库生成(我需要在持久化对象之前使用密钥).

我知道Java使用带有加密安全随机数生成器的类型4 UUID,但是我知道UUID并不是完全随机的,所以我的问题是假设无法从一组现有的uuid中预测uuids是多么安全?

Rob*_*ert 33

好吧,如果你想知道UUID的随机性,你必须查看源代码.

以下代码部分取自OpenJDK7(在OpenJDK6完全相同):

public static UUID randomUUID() {
        SecureRandom ng = numberGenerator;
        if (ng == null) {
            numberGenerator = ng = new SecureRandom();
        }

        byte[] randomBytes = new byte[16];
        ng.nextBytes(randomBytes);
        randomBytes[6]  &= 0x0f;  /* clear version        */
        randomBytes[6]  |= 0x40;  /* set to version 4     */
        randomBytes[8]  &= 0x3f;  /* clear variant        */
        randomBytes[8]  |= 0x80;  /* set to IETF variant  */
        return new UUID(randomBytes);
    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,16个字节中只有2个不是完全随机的.在第六个字节中,您将丢失4个中的4个,在字节8上,您将丢失2位随机性.

因此,您将获得具有122位随机性的128位值.

操作可能产生的唯一问题是,您的数据很有可能被识别为UUID.因此,如果您想将其隐藏在其他随机数据中,这将无效...

  • @Robert这很好,但我不理解声明**操作可能产生的唯一问题是很有可能您的数据被识别为UUID.因此,如果您想将其隐藏在其他随机数据中,这将无效...**.你能详细说明吗? (3认同)
  • @alwinc很难回答你的问题,因为这取决于你想如何使用UUID.如果某人例如因任何原因使用UUID作为AES-128密钥,他将丢失6位密钥长度而不会注意到它.这可能会简化进一步的加密攻击.如上所述,区分真实随机数据和UUID的可能性也是一个主题,但我无法想象这是一个问题. (2认同)