如何创建一个由20个随机字节组成的数组?


Answers:



46

如果您希望使用密码学上很强的随机数生成器(也是线程安全的)而不使用第三方API,则可以使用SecureRandom

Java 6和7:

SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);

Java 8(甚至更安全):

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);

16

如果您已经在使用Apache Commons Lang,那么 RandomUtils 这将成为一线手:

byte[] randomBytes = RandomUtils.nextBytes(20);

8
进行一些挖掘之后,RandomUtils在后台而不是SecureRandom使用Math.random()。只是想使这一点明确。
Evo510 '16

此方法已不存在。
马丁·海姆斯特拉


@DuncanJones我正在使用使用Commons lang 3.7的Spring boot 2,它已被删除。查看源代码表明它已被注释掉。因此,我不会信任此代码,因为升级可能会使您的代码不可编译。
Martijn Hiemstra '18

8

Java 7引入了ThreadLocalRandom,它与当前线程隔离

这是铁道学解决方案的另一种形式。

final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);

1
这个词后面也许有太多括号了ThreadLocalRandom吗?更好:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt

4

创建一个带有种子的Random对象,并通过执行以下操作获得随机数组:

public static final int ARRAY_LENGTH = 20;

byte[] byteArray = new byte[ARRAY_LENGTH];
new Random(System.currentTimeMillis()).nextBytes(byteArray);
// get fisrt element
System.out.println("Random byte: " + byteArray[0]);

0

对于那些想要一种更安全的方法来创建随机字节数组的人,最安全的方法是:

byte[] bytes = new byte[20];
SecureRandom.getInstanceStrong().nextBytes(bytes);

但是,如果机器上没有足够的随机性,则线程可能会阻塞,具体取决于您的操作系统。以下解决方案将不会阻止:

SecureRandom random = new SecureRandom();
byte[] bytes = new byte[20];
random.nextBytes(bytes);

这是因为第一个示例/dev/random在等待更多随机性(由鼠标/键盘和其他来源生成)时使用和会阻塞。第二个示例使用/dev/urandom不会阻塞的示例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.