Как создать массив из 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);
DavidR
источник
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]);
ΦXocę 웃 Пepeúpa ツ
источник
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не блокирующий.

Том Хейдж
источник