Как создать массив из 20 случайных байтов?


Ответы:



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 использует под капотом Math.random (), а не SecureRandom. Просто хотел сделать это явным.
Evo510

Такого метода больше не существует.
Martijn Hiemstra

@MartijnHiemstra Это действительно существует: github.com/apache/commons-lang/blob/master/src/main/java/org/…
Дункан Джонс

@DuncanJones Я использую Spring boot 2, который использует Commons lang 3.7, и он был удален. Просмотр исходного кода показывает, что он был закомментирован. Поэтому я бы не стал доверять этому коду, поскольку обновление может сделать ваш код некомпилируемым.
Martijn Hiemstra

8

Java 7 представила ThreadLocalRandom, который изолирован от текущего потока .

Это еще одна интерпретация решения maerics .

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

1
Может быть, слишком много скобок после слова ThreadLocalRandom? Лучше:ThreadLocalRandom.current().nextBytes(bytes);
Эрвин Болвидт

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не блокирующий.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.