如何创建一个包含 20 个随机字节的数组?
Posted
技术标签:
【中文标题】如何创建一个包含 20 个随机字节的数组?【英文标题】:How to create an array of 20 random bytes? 【发布时间】:2011-08-06 16:39:18 【问题描述】:如何在 Java 中创建一个包含 20 个随机字节的数组?
【问题讨论】:
【参考方案1】:试试Random.nextBytes
方法:
byte[] b = new byte[20];
new Random().nextBytes(b);
【讨论】:
值得一提的是,这不是加密安全的。如果需要,请参阅other answer。【参考方案2】:如果您想要一个加密强的随机数生成器(也是线程安全的)而不使用第三方 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);
【讨论】:
【参考方案3】:如果您已经在使用 Apache Commons Lang,RandomUtils
将使其成为单行:
byte[] randomBytes = RandomUtils.nextBytes(20);
注意:这不会产生加密安全字节。
【讨论】:
在进行了一些挖掘之后,RandomUtils 在后台使用 Math.random(),而不是 SecureRandom。只是想明确这一点。 这个方法已经不存在了。 @MartijnHiemstra 它确实存在:github.com/apache/commons-lang/blob/master/src/main/java/org/… @DuncanJones 我正在使用使用 Commons lang 3.7 的 Spring boot 2,它已被删除。查看源代码显示它已被注释掉。所以我不会相信这段代码,因为升级可能会使你的代码无法编译。 @MartijnHiemstra 我查看了最新的文档:commons.apache.org/proper/commons-lang/apidocs/index.html 以及 3.7 版的文档:commons.apache.org/proper/commons-lang/javadocs/api-3.7/org/… 他们似乎都有 nextBytes 方法。也许 spring boot 没有导入正确的库?【参考方案4】:Java 7 引入了ThreadLocalRandom,它与当前线程隔离。
这是maerics's solution 的另一个版本。
final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);
【讨论】:
ThreadLocalRandom
后面的括号可能太多了?更好:ThreadLocalRandom.current().nextBytes(bytes);
【参考方案5】:
使用种子创建一个 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]);
【讨论】:
【参考方案6】:对于那些想要更安全的方法来创建随机字节数组的人来说,是的,最安全的方法是:
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
,不会阻塞。
【讨论】:
只有在要求及时性而不是正确性的情况下,或者在这种情况下是真正的随机性时,才应该使用此示例。 /dev/urandom 如果不能创建真正的随机性,则不会阻塞,并且会尽力而为。 /dev/random 将阻塞直到随机性得到保证。以上是关于如何创建一个包含 20 个随机字节的数组?的主要内容,如果未能解决你的问题,请参考以下文章