Como criar uma matriz de 20 bytes aleatórios?


Respostas:



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);

16

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

byte[] randomBytes = RandomUtils.nextBytes(20);

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);

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]);

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.