我想在Java中生成一个128位的随机密钥。我正在使用以下代码:
byte[] byteBucket = new byte[bytelength];
randomizer.nextBytes(byteBucket);
我的字节数组长度会是16还是128呢?(16*8=128)。
尝试使用 SecureRandom API。
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[16]; // 128 bits are converted to 16 bytes;
random.nextBytes(bytes);
有一个名为 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.