在Java中生成128位随机密钥

6
我想在Java中生成一个128位的随机密钥。我正在使用以下代码:
byte[] byteBucket = new byte[bytelength];
randomizer.nextBytes(byteBucket);

我的字节数组长度会是16还是128呢?(16*8=128)。

2个回答

13

尝试使用 SecureRandom API。

SecureRandom random = new SecureRandom();
byte bytes[] = new byte[16]; // 128 bits are converted to 16 bytes;
random.nextBytes(bytes);

一个长度为16的数组不是有17个元素吗? - TwentyCharMax
2
新的byte[16]将包含16个元素。它们的索引为0到15。 - Joth

7

UUID

有一个名为 java.util.UUID 的类,其中有一个方法可以生成一个基于随机数的UUID。这个128位值中有122位是随机生成的。

UUID uuid = UUID.randomUUID() ;

调用 toString 方法以以带连字符的规范格式查看值的十六进制字符串。

uuid.toString(): 24b47cf5-fb53-4fb1-a5a2-8b415260304d

您可以将这128位提取为一对64位 long 整数。调用 getMostSignificantBits()getLeastSignificantBits() 方法。

long mostSignificant = uuid.getMostSignificantBits() ;
long leastSignificant = uuid.getLeastSignificantBits() ;

这个值可能不适用于关键安全应用程序,因为4位是可预测的(不是随机的)。但在其他实际应用中,这个方便的类可能效果很好。

下面是我在SO上发现的一个问题,其中包含更详细的解释:在Java中使用UUID的最高有效位的碰撞可能性


java.util.UUID/randomUUID 不适用于通用的128位随机数生成,因为它只能生成122个随机位。请参见https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29。 - David J.
1
@DavidJames 请进一步解释,因为在UUID的javadocs中提到:“表示不可变的通用唯一标识符(UUID)的类。 UUID表示128位值。”我理解它实际上只生成了122位。但是它在全球范围内也是唯一的,对吗? - Bilbo Baggins
1
两种评论都是正确的:在基于随机数的UUID中,128位中有122位是随机生成的。因此从技术上讲,这并不满足问题所需的128位随机性。但实际上,在现实世界的工作中,两者碰撞的几率相同:几乎为零。对于关键安全应用程序,随机UUID可能不太合适,但对于其他非关键应用程序,随机UUID效果很好,并且使用内置的Java类仅需要一行短代码。 - Basil Bourque

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接