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

16

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

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

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


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

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

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á.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.