Como criar uma matriz de 20 bytes aleatórios?

130

Como posso criar uma matriz de 20 bytes aleatórios em Java?

novicePrgrmr
fonte

Respostas:

277

Experimente o Random.nextBytesmétodo:

byte[] b = new byte[20];
new Random().nextBytes(b);
maerics
fonte
46

Se você quiser um gerador de números aleatórios com criptografia forte (também seguro para threads) sem usar uma API de terceiros, poderá usar SecureRandom.

Java 6 e 7:

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

Java 8 (ainda mais seguro):

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

Se você já estiver usando o Apache Commons Lang, RandomUtils isso tornará a linha única:

byte[] randomBytes = RandomUtils.nextBytes(20);
Duncan Jones
fonte
8
Depois de cavar, o RandomUtils usa Math.random () sob o capô, não o SecureRandom. Só queria deixar isso explícito.
Evo510
Este método não existe mais.
Martijn Hiemstra
@DuncanJones Estou usando o Spring boot 2, que usa o Commons lang 3.7 e foi removido. A visualização do código-fonte mostra que ele foi comentado. Portanto, não confio neste código, pois uma atualização pode tornar seu código compilável.
Martijn Hiemstra
8

O Java 7 introduziu o ThreadLocalRandom, que é isolado no encadeamento atual .

Esta é uma outra versão da solução dos maerics .

final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);
Jin Kwon
fonte
1
Talvez alguns parênteses demais depois da palavra ThreadLocalRandom? Melhor:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt
4

Crie um objeto Random com uma semente e obtenha a matriz aleatoriamente, fazendo:

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]);
OcXocę 웃 pepeúpa ツ
fonte
0

Para aqueles que desejam uma maneira mais segura de criar uma matriz de bytes aleatória, sim, a maneira mais segura é:

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

MAS seus encadeamentos podem bloquear se não houver aleatoriedade suficiente disponível na máquina, dependendo do sistema operacional. A seguinte solução não será bloqueada:

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

Isso ocorre porque o primeiro exemplo usa /dev/randome bloqueará enquanto aguarda mais aleatoriedade (gerada por um mouse / teclado e outras fontes). O segundo exemplo usa /dev/urandomque não será bloqueado.

Tom Hage
fonte