Як створити масив з 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


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

8

Java 7 представила ThreadLocalRandom, яка є виділеною до поточного потоку .

Це чергове видання рішення маерики .

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.