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