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