Java SecureRandom genera un número aleatorio seguro

2

La forma de generar un número aleatorio seguro de longitud de bits es de 256 bits utilizando Java. ¿Cuál es la diferencia entre:

SecureRandom random = new SecureRandom(); 
                and
SecureRandom prng = SecureRandom.getInstance("SHA1PRNG");
    
pregunta user236501 01.03.2013 - 14:28
fuente

2 respuestas

3

Con la primera línea, permite que la JVM use la implementación "segura aleatoria" que se registra como implementación predeterminada en esa JVM, mientras que la segunda línea obliga al uso de una implementación específica.

Se recomienda usar el valor predeterminado ( new SecureRandom() ) porque una plataforma específica compatible con Java podría tener un proveedor dedicado que sea "mejor" (por ejemplo, si la plataforma tiene un RNG de hardware, la JVM podría haberse configurado para usar) con una implementación específica de la interfaz SecureRandomSpi , que se obtiene al seleccionar el "proveedor predeterminado" pero no al imponer el uso de "SHA1PRNG" ).

    
respondido por el Tom Leek 01.03.2013 - 16:26
fuente
0

Bueno, me gusta corregir algunas cosas sobre SecureRandom. Supongo que mi versión era diferente de la actual, en realidad sí que obtiene sus semillas desde una ubicación bastante impredecible, algo con intervalos de espera de rendimiento de subprocesos. Aún así, siempre sigue reutilizando las mismas 20 semillas una y otra vez, sí, parece imposible en este momento resolverlo y probablemente se deba al hecho de que la mayoría de las personas se rendirán, pero ahora es como una baraja de RNG si alguien está lo suficientemente loco y no lo vuelves a sembrar, todavía pueden descubrir todas las semillas.

La única diferencia entre new Random() y new SecureRandom() es cómo se selecciona la semilla en Random; usa milisegundos en SecureRandom; usa nanosegundos, que son mucho más difíciles de predecir, en realidad milisegundos.

Pero solo un millón de intentos adicionales lo recuerdan y sincronizan el generador de números aleatorios.

Debería volver a sembrar su RNG cada pocas llamadas e incluso esto podría predecirse si alguien lo estudia el tiempo suficiente, no puede volver a sembrarlo con un RNG similar, ya que también tiene el defecto. Porque si alguien lo estudia el tiempo suficiente, lo resolverán, aunque este punto es muy delicado y está relacionado con la suerte, pero hay gente que hace esto, solo requiere que los tiempos sean los adecuados.

Aunque sé que no preguntaste sobre new Random() solo tratas de decir que no es tan seguro como puedes pensar que un mejor generador de números aleatorios usaría polvo de tu RAM, por ejemplo, en cualquier ubicación aleatoria que incluya muchos los factores que las personas externas no pueden entender ... como dónde se carga la VM de Java en la memoria a menos que secuestren su sistema remoto, lo que hace que cualquier cosa que haga no sea segura, jaja.

    
respondido por el SSpoke 12.05.2014 - 07:37
fuente

Lea otras preguntas en las etiquetas