¿Cómo crear una matriz de 20 bytes aleatorios?

Respuestas:

46

Si desea un generador de números aleatorios criptográficamente fuerte (también seguro para subprocesos) sin usar una API de terceros, puede usarlo SecureRandom.

Java 6 y 7:

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

Java 8 (aún más seguro):

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

Si ya está usando Apache Commons Lang, RandomUtils esto lo convierte en una línea:

byte[] randomBytes = RandomUtils.nextBytes(20);
Duncan Jones
fuente
8
Después de cavar un poco, RandomUtils usa Math.random () debajo del capó, no SecureRandom. Solo quería hacer esto explícito.
Evo510
Este método ya no existe.
Martijn Hiemstra
@MartijnHiemstra Sí existe: github.com/apache/commons-lang/blob/master/src/main/java/org/…
Duncan Jones
@DuncanJones Estoy usando Spring boot 2 que usa Commons lang 3.7 y se ha eliminado. Ver el código fuente muestra que ha sido comentado. Por lo tanto, no confiaría en este código, ya que una actualización podría hacer que su código no sea compatible.
Martijn Hiemstra
8

Java 7 introdujo ThreadLocalRandom que está aislado del hilo actual .

Esta es otra versión de la solución de Maerics .

final byte[] bytes = new byte[20];
ThreadLocalRandom.current().nextBytes(bytes);
Jin Kwon
fuente
1
¿Quizás algunos paréntesis son demasiados después de la palabra ThreadLocalRandom? Mejor:ThreadLocalRandom.current().nextBytes(bytes);
Erwin Bolwidt el
4

Cree un objeto aleatorio con una semilla y obtenga la matriz al azar haciendo:

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 ツ
fuente
0

Para aquellos que desean una forma más segura de crear una matriz de bytes aleatoria, sí, la forma más segura es:

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

PERO sus hilos podrían bloquearse si no hay suficiente aleatoriedad disponible en la máquina, dependiendo de su sistema operativo. La siguiente solución no bloqueará:

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

Esto se debe a que el primer ejemplo usa /dev/randomy bloqueará mientras espera más aleatoriedad (generado por un mouse / teclado y otras fuentes). El segundo ejemplo utiliza /dev/urandomque no bloqueará.

Tom Hage
fuente