En teoría de la información, un mensaje es equivalente a un texto codificado como una ordenación de símbolos (letras, espacios, signos de puntuación), lo que comúnmente llamamos una cadena de caracteres. Si deseáramos calcular qué tan segura es una contraseña, esto es, qué tan capaces somos de predecir el contenido del mensaje que la conforma, buscaríamos conocer qué tan aleatoria es la cadena de caracteres que la componen. Esta medida del desorden o incertidumbre es lo que conocemos como Entropía de la información (H).
Si consideramos una contraseña como un texto codificado y quisiéramos que la entropía de esta clave sea la máxima (tan aleatoria como sea posible) deberíamos asegurarnos que la entrada de caracteres sea poco probable de pronosticar, que cada caracter se repita o esté ordenado de una manera impredecible. Ahora bien, ¿cómo calculamos la Entropía de una contraseña? Habrá que entrar en el terreno duro de las matemáticas y la estadística.
Las matemáticas detrás de una contraseña
En estadística, llamamos Espacio Muestral (Ω) a todos los estados posibles de un experimento. Por ejemplo, al lanzar un dado, nuestro espacio muestral son los seis números correspondientes a cada una de las caras del dado, Ω={1,2,3,4,5,6}. En el caso de una contraseña, nuestro espacio muestral estará conformado por todas las permutaciones posibles en el universo de caracteres para cada combinación de los mismos. Esto es:
Ω (N,K) = {k1,k2,…,ki}
Dónde ki es cada uno de los estados (subconjunto de caracteres) posibles de los N caracteres del conjunto y K es la cantidad de caracteres del subconjunto o longitud de la contraseña.
Ahora bien, las claves las construimos a partir de un subconjunto de letras mínusculas y mayúsculas, números y símbolos escogidos de manera aleatoria. Por lo tanto, inicialmente el grado de indeterminación de un mensaje equivale a ki: existen ki estados posibles, cada uno de logitud K. Entonces, la probabilidad de aparición de cada una de las combinaciones que formen nuestra contraseña será:
P = 1 / ki
Y por lo tanto, la entropía del mensaje (H(x)) alcanzará el valor medio ponderado de la suma de probabilidades de los diversos estados del mismo expresado en binario (queremos medir «bits»). Es decir:
H(x) = — ∑ P(xi) log2[P(xi)]
; para todo i desde 1 hasta ki
Como habíamos mencionado, cada caracter de la cadena es escogido de manera aleatoria y por lo tanto, todos los estados (permutaciones) son equiprobables. Sintetizando: entre un total de N caracteres aleatorios formando una contraseña de longitud K, podemos expresar que:
H(x) = K log2[N]
Algunos ejemplos:
Supongamos que nuestra contraseña tiene 4 caracteres y es una combinación de números del 0-9. Entonces:
K = 4; N = 10
H(x1) = 4 log2[10] = 4 x 3,32192809489
H(x1) = 13,2877123796
Supongamos ahora que a la contraseña anterior le añadimos letras minúsculas y mayúsculas sin modificar su longitud. Ahora:
K = 4; N = 62 (26 min + 26 may + 10 núm)
H(x2) = 4 log2[62] = 4 x 5,95419631039
H(x2) = 23,8167852415
Para un último ejemplo, esta vez nuestra contraseña tendrá 8 caracteres:
K = 8; N = 62
H(x3) = 8 log2[62] = 8 x 5,95419631039
H(x3) = 47,6335704831
¿Qué representan estos resultados?
Hemos visto cómo aumentando tanto el tamaño de nuestro universo de caracteres como la longitud del subconjunto, la entropía aumenta. Pero, ¿qué representa este resultado en términos de seguridad de la información? Pues bien, como mencionaba, el valor está expresado en binario (bits) y por lo tanto 2^H(x) equivale a calcular el tamaño de nuestro espacio muestral, es decir: ¿de cuántas maneras se pueden permutar y combinar los caracteres para obtener una contraseña de una determinada longitud?
Entonces, para cada uno de los ejemplos anteriores:
2^H(x1) = 2^13,2877123796 = 10.000
2^H(x2) = 2^23,8167852415 = 14.776.335,9995
2^H(x3) = 2^47,6335704831 = 2,18340105586e+14
Es decir, para una contraseña de ±47 bits contamos con ±2e+14 (un 2 seguido de 14 ceros) permutaciones posibles. Esto significa que si tuviésemos un programa automatizado capaz de calcular 1.000.000 de permutaciones por segundo, para dar con nuestra clave (desde el punto de vista probabilístico), necesitaría aproximadamente 7 años de continuo procesamiento.
Finalmente, es fácil demostrar que 2^H(x) = N^K y por lo tanto:
2^H(x1) = 10^4 = 10.000
2^H(x2) = 62^4 = 14.776.335,9995
2^H(x3) = 62^8 = 2,18340105586e+14
Sintetizando, esta fórmula se puede expresar como:
complejidad^longitud
ó en bits:
H(x) = log2[complejidad^longitud]
Consideraciones finales
Para terminar, quisiera añadir tres puntos de chequeo que considero importantes al momento de construir una contraseña segura.
La aletoriedad es imporante
Como vimos, la entropía se maximiza en base a la probabilidad de un evento. Si los diversos estados de un mensaje no son equiprobables, la entropía disminuye. Por ejemplo, si en lugar de usar combinaciones aleatorias usamos palabras comunes (casa, cerveza, operando) la probabilidad de que los caracteres más usados del alfabeto (a, e, c, m) caigan en la contraseña es mayor que la de los menos usados (k, w, x) y por lo tanto este cambio en el valor de la suma ponderada de las probabilidades hará que nuestra clave sea menos segura, independientemente de la complejidad y longitud.
Usar contraseñas distintas para cada cuenta
Esto puede ser agotador y hasta aburrido. Además, requiere que llevemos algún tipo de sistema de administración de claves, pues todos tenemos nuestras limitaciones al momento de memorizar cadenas de caracteres aleatorios. Esto, puede jugar en contra si no somos cuidadosos con nuestro sistema (por ejemplo, tener todas las claves en un cuaderno que llevamos con nosotros a todas partes).
Sin embargo, es altamente aconsejable que cada cuenta tenga su contraseña y que cada contraseña tenga una complejidad y longitud diferentes. Por ejemplo, si usamos una clave para todo y un atacante da con esa clave, tendrá acceso a todas nuestras cuentas. Por otro lado, si las claves son distintas, pero todas tienen la misma longitud, cuando un atacante sepa una de las claves, tendrá información suficiente para buscar las demás.
Cambiar las contraseñas cuando sospechamos que pudo ser vulnerada
Muchos consideran innecesario estar cambiando una clave cada cierto tiempo: si la contraseña es lo suficientemente segura, no es necesario modificarla; si la entropía de la vieja clave es igual a la de la nueva, cambiarla no modificará la probabilidad de que un atacante la descifre. Entonces, ¿por qué tantos recomiendan cambiar las contraseñas periódicamente?
Desde mi punto de vista, debemos estar atentos a las operaciones que realizamos en nuestra informática diaria. Si por algún despiste (que ocurren seguido) hemos dejado vulnerable nuestra clave, lo natural sería cambiarla. Lo mismo si nuestros equipos se traspasan a otros usuarios: regalamos nuestro teléfono móvil, vendemos una laptop para comprar una nueva, etcétera.
Fuentes:
Entropía (información) – Wikipedia, la enciclopedia libre