Java随机UUID是否可预测?

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

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

回答:

好吧,如果您想知道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);

}

如您所见,16个字节中只有2个不是完全随机的。在第六个字节中,您丢失8位中的4位,在字节8中,您失去2位随机性。

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

操作可能引起的唯一问题是,很有可能将您的数据识别为UUID。因此,如果您想将其隐藏在其他随机数据中,将无法使用…

以上是 Java随机UUID是否可预测? 的全部内容, 来源链接: utcz.com/qa/399018.html

回到顶部