¿Cuántos bits de entropía contiene un identificador?

13

Según enlace :

  

Suponiendo que los identificadores de sesión se generen utilizando una buena fuente de números aleatorios, estimaremos que el número de bits de entropía en un identificador de sesión sea la mitad del número total de bits en el identificador de sesión.

¿Cómo se determina cuántos bits de entropía contiene realmente una implementación particular? Por ejemplo, si ejecuto new BigInteger (130, new SecureRandom () en Java, ¿realmente termino con 130 bits de entropía?

    
pregunta Gili 04.06.2014 - 23:32
fuente

1 respuesta

12

La entropía en un identificador de sesión es la entropía de la fuente numérica subyacente; un PRNG puede producir buenas palabras aleatorias de 32 bits, cada una de las cuales tiene 32 bits de entropía (sin embargo, como señaló @forrest, la entropía no "lleva"; crecerá hasta que alcance el tamaño del estado interno del PRNG, y teóricamente ese estado podría calcularse de forma retroactiva si se obtiene una salida suficiente. A partir de ese momento, la salida de PRNG es predecible, con una entropía de cero. Un generador "verdaderamente aleatorio" tiene un estado interno de tamaño infinito).

Esto significa que cada bit es más o menos completamente impredecible (el 'más o menos' se deriva de que el PRNG es un generador de números aleatorios (P) seud ).

Cuando este número de 32 bits está codificado en un identificador, generalmente por codificación hexadecimal, se convierte en algo así como 1A9F72EF . Ahora son ocho bytes , por lo tanto, bits , sin embargo, aún contienen la misma entropía que antes, que era de 32 bits.

Si hubiéramos usado la codificación base64, nuestro identificador habría tenido 6 bits de entropía para cada carácter, es decir, 8 bits; por lo que la entropía sería 3/4 de la longitud en bits del identificador (o el identificador sería 8/6 de la longitud de su representación binaria).

Ahí es de donde vino el "1/2" de OWASP.

Ahora, la entropía de una fuente no se puede determinar observando una sola instancia; por lo general, debe saber con certeza cómo funciona la fuente. Una fuente aleatoria es por definición pura entropía. Una fuente constante (siempre devuelve 42) tiene una entropía de cero incluso cuando "42" está representado por seis u ocho bits.

Usando una aproximación muy aproximada y poco confiable, la entropía es dos veces el número de bits que cambian en promedio de una representación a la siguiente , siempre que los cambios sean aleatorios y no se repitan. Una secuencia de [00FF, FF00, 00FF, FF00 ...] cambiaría todos sus bits, pero solo hay dos símbolos en la secuencia, por lo que un bit es suficiente para describirlo completamente; El estado interno del generador es de un bit de ancho.

El gran problema es determinar si una fuente es "true" (pseudo-) random .

Si puedes confiar en SecureRandom (¡probablemente puedas!), entonces sí, BigInteger(130, new SecureRandom()) te dará un número con 130 bits de entropía. Puede codificarlo como una secuencia hexadecimal de 260 bits o una secuencia Base64 de 176 bits.

Solo asegúrese de que la alimentación de la agrupación de entropía SecureRandom se actualice con suficiente frecuencia con cierta aleatoriedad, o su identificador podría volverse predecible. Un (in) caso famoso es el Mersenne Twister , donde tener unos 624 valores secuenciales fuera del generador permite recuperar los 19967 bits de su estado interno a través de álgebra lineal, y desde allí prediciendo con certeza todos sus valores futuros.

    
respondido por el LSerni 05.06.2014 - 00:59
fuente

Lea otras preguntas en las etiquetas