Joven hacker sonriendo

Hackeamos su software

cero falsos positivos

Inteligencia experta + Tecnología especializada
DXST - SAST - IAST - SCA - DevSecOps
Caja blanca - Caja gris - Caja negra
Atacando Aplicaciones Web, APIs, Apps Móviles,
Cliente Servidor, Servidores, Redes, Dispositivos IoT
IoT SCI: Sistemas de Control Industrial

Generar Valores Aleatorios de Manera Segura

Nuestros ethical hackers explican cómo evitar vulnerabilidades de seguridad mediante la programación segura en Java al generar valores aleatorios de manera segura. Es importante que al momento de generar valores aleatorios éstos no puedan replicarse facilmente para evitar brechas de seguridad.

Necesidad

Se requiere utilizar una función de generación de números, cadenas o sales aleatorias en la aplicación.

Contexto

A continuación se describen las circunstancias bajo las cuales la siguiente solución tiene sentido:

  1. Se está desarrollando una aplicación en Java 1.4 o superior.

  2. La aplicación necesita generar números aleatorios usados como identificadores que no se almacenan.

Solución

La generación de números pseudo-aleatorios criptográficamente seguros se usa con el fin de satisfacer requerimientos de seguridad en la creación de claves, firmas o certificados digitales y, en general, para crear algoritmos de encriptación que usan llaves numéricas de un sólo uso.

En Java, la clase java.security.SecureRandom proporciona un generador de números pseudoaleatorios que cumplen, por lo menos, con la especificación FIPS 140-2 sobre pruebas estadísticas para generadores de números aleatorios y requisitos de seguridad de los módulos criptográficos [1].

La especificación define 4 niveles de seguridad entre los cuales se menciona que se debe añadir una resistencia a la intrusión tanto física como lógica con fines de desmontaje o modificación, de manera que dificulte al máximo los ataques para lo cual, se debe contar con una protección criptográfica y administración de claves de forma eficiente.

Adicionalmente, la clase debe producir una salida no determinística, por lo tanto, requiere que la semilla no sea predecible y que la salida sean secuencias criptográficamente fuertes tal como está descrito en RFC 1750: Recomendaciones de aleatoriedad para la seguridad [2].

  1. Se debe importar la clase SecureRandom de la biblioteca security.

    randomNumber.java
    1
    import java.security.SecureRandom;
    
  2. Se define el método generateRandomNumber en conjunto con SecureRandom, para generar un número aleatorio de tipo entero.

  3. Declaramos el método, retornará un número de tipo int.

    1
    public static int generateRandomNumber() {
    
  4. Se declara un array de bytes con el tamaño de un entero para sistemas operativos de 32 bits.

    1
    byte[] integer = new byte[4];
    
  5. Se usa SecureRandom y su método nextBytes para llenar aleatoriamente el array. Se debe tener en cuenta que a partir de la versión 8 de Java, se recomienda instanciar el método getInstanceStrong() para una mayor entropía.

    1
    2
    SecureRandom random = new SecureRandom.getInstanceStrong();
    random.nextBytes(integer);
    
  6. Hacemos uso del método toInt [3] para convertir el array de bytes a entero. Retornamos el valor generado.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    return toInt(integer);
    }
    
    public static int toInt(byte[] bytes) {
    int result = 0;
    for (int i = 0; i < 4; i++) {
      result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i];
    }
     return result;
    }
    
  7. Este es el resultado para la generación de números aleatorios.

    1
    2
    3
    4
    -1061930007
    1168469548
    -1436156118
    1022454756
    



Haz un comentario

Estado de los servicios - Términos de Uso