Joven hacker sonriendo

Generar Cadenas Aleatorias de Manera Segura

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

Necesidad

Se requiere utilizar una función de generación de cadenas 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 cadenas aleatorias usadas para identificar archivos generados en directorios públicos.

Solución

La generación de valores aleatorios 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 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 del paquete security y BigInteger del paquete math.

    randomNumber.java
    1
    2
    import java.security.SecureRandom;
    import java.math.BigInteger;
    
  2. Se define el método generateRandomText, el cual retornará una cadena de texto aleatoria.

    1
    public static String generateRandomText() {
    
  3. Instanciamos BigInteger pasándole una instancia de SecureRandom como generador de números aleatorios. Luego, convertimos el número a String. Retornamos el valor obtenido.

    1
    2
    3
    4
     SecureRandom random = new SecureRandom();
     String text = new BigInteger(130, random).toString(32);
     return text;
    }
    
  4. A continuación se puede observar algunos de los resultados para la generación de cadenas aleatorias.

    1
    2
    3
    4
    f1gk6tj9l1012scp1412elkqp1
    ugs6av8mq7nq05boivd8kghv86
    crni7ciuhvoh75j68hltm774l
    a5tji2kptaok52j5rq41g077rp
    
  5. En conclusión, se debe tener en cuenta que la calidad de los valores producidos de forma aleatoria se basa en la impredecibilidad o alto grado de entropía de los mismos. Por tanto, la generación de datos aleatorios es más fuerte de forma inversamente proporcional a la posibilidad de predicción de sus resultados.




Haz un comentario

Estado de los servicios - Términos de Uso