Números aleatorios vs seguros aleatorios en Java

Requisito previo: generación de números aleatorios en Java
Clase java.security.SecureRandom:  esta clase proporciona un generador de números aleatorios (RNG) criptográficamente fuerte. Un número aleatorio criptográficamente fuerte cumple mínimamente con las pruebas estadísticas del generador de números aleatorios especificadas en FIPS 140-2, Requisitos de seguridad para módulos criptográficos , sección 4.9.1. Además, SecureRandom debe generar resultados no deterministas. Por lo tanto, cualquier material inicial que se pase a un objeto SecureRandom debe ser impredecible y todas las secuencias de salida de SecureRandom deben ser criptográficamente sólidas.
Clase java.util.Random: Las clases definidas en Random no son criptográficamente sólidas y los números elegidos no son completamente aleatorios porque se usa un algoritmo matemático definido (basado en el algoritmo generador de números aleatorios sustractivos de Donald E. Knuth) para seleccionarlos. Por lo tanto, no es seguro usar esta clase para tareas que requieren un alto nivel de seguridad, como crear una contraseña aleatoria, etc. 

Aleatorio vs SeguroAleatorio

  1. Tamaño: una clase aleatoria tiene solo 48 bits, mientras que SecureRandom puede tener hasta 128 bits. Por lo que las posibilidades de repetir en SecureRandom son menores.
  2. Generación de semillas: Random utiliza el reloj del sistema como semilla o para generar la semilla. Por lo que pueden reproducirse fácilmente si el atacante conoce el momento en que se generó la semilla. Pero SecureRandom toma datos aleatorios de su sistema operativo (pueden ser intervalos entre pulsaciones de teclas, etc., la mayoría de los sistemas operativos recopilan estos datos y los almacenan en archivos: /dev/random y /dev/urandom en el caso de linux/solaris) y los utilizan como semilla. .
  3. Descifrar el código: en caso de que sea aleatorio, solo se requieren 2^48 intentos, con las CPU avanzadas de hoy en día es posible descifrarlo en un tiempo práctico. Pero para la seguridad, se requerirán 2^128 intentos aleatorios, lo que llevará años y años para alcanzar el equilibrio con las máquinas avanzadas de hoy.
  4. Función generadora: la implementación estándar de Oracle JDK 7 utiliza lo que se denomina un generador lineal congruente para producir valores aleatorios en java.util.Random. Mientras que Secure Random implementa el algoritmo SHA1PRNG, que usa SHA1 para generar números pseudoaleatorios. El algoritmo calcula el hash SHA-1 sobre un número aleatorio verdadero (usa una fuente de entropía) y luego lo concatena con un contador de 64 bits que se incrementa en 1 en cada operación.
  5. Seguridad: En consecuencia, el java.util. La clase aleatoria no debe usarse para aplicaciones críticas para la seguridad ni para proteger datos confidenciales. 

Generación de números aleatorios usando java.util.Random; 

Java

// A Java program to demonstrate
// random number generation
// using java.util.Random;
import java.util.Random;
 
public class generateRandom {
 
    public static void main(String args[])
    {
        // create instance of Random class
        Random rand = new Random();
 
        // Generate random integers in range 0 to 999
        int rand_int1 = rand.nextInt(1000);
        int rand_int2 = rand.nextInt(1000);
 
        // Print random integers
        System.out.println("Random Integers: " + rand_int1);
        System.out.println("Random Integers: " + rand_int2);
    }
}

Producción: 

Random Integers: 956
Random Integers: 678

Generación de números aleatorios usando java.security.SecureRandom;

Java

// A Java program to demonstrate secure
// random number generation
// using java.security.SecureRandom
import java.security.SecureRandom;
 
public class generateRandom {
 
    public static void main(String args[])
    {
        // create instance of SecureRandom class
        SecureRandom rand = new SecureRandom();
 
        // Generate random integers in range 0 to 999
        int rand_int1 = rand.nextInt(1000);
        int rand_int2 = rand.nextInt(1000);
 
        // Print random integers
        System.out.println("Random Integers: " + rand_int1);
        System.out.println("Random Integers: " + rand_int2);
    }
}

Producción: 

Random Integers: 817
Random Integers: 500

Este artículo es una contribución de Saket Kumar . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *