La criptografía usa conceptos probabilísticos para generar claves, medir incertidumbre, evitar patrones y analizar la posibilidad de colisiones. En seguridad, una pequeña debilidad probabilística puede convertirse en un ataque práctico.
Un sistema criptográfico debe ocultar información incluso cuando el atacante conoce el algoritmo. La incertidumbre debe provenir de claves y valores aleatorios suficientemente impredecibles.
Si una clave tiene L posiciones y cada posición puede tomar A símbolos, hay AL claves posibles:
Un espacio grande dificulta la búsqueda exhaustiva, siempre que las claves se elijan de forma impredecible y el algoritmo no tenga debilidades.
Para una variable discreta con probabilidades pi, la entropía de Shannon es:
La entropía es máxima cuando todos los resultados son equiprobables. Una contraseña elegida por una persona puede tener muchas menos posibilidades efectivas que su longitud aparente.
La aleatoriedad usada para claves, tokens y nonces debe provenir de un generador criptográficamente seguro. Un generador estadísticamente uniforme puede seguir siendo predecible si se conoce su estado.
En JavaScript, Math.random() sirve para demostraciones, no para secretos. Para contextos compatibles se debe usar una API criptográfica como crypto.getRandomValues().
Una función hash transforma una entrada de longitud arbitraria en una salida de longitud fija. Como hay infinitas entradas y un número finito de salidas, necesariamente existen colisiones.
Un hash criptográfico busca que encontrar una colisión sea computacionalmente difícil, no que sea matemáticamente imposible.
Si se generan valores uniformes en un espacio de M posibilidades, la probabilidad de que aparezca al menos una colisión después de n valores es:
La probabilidad crece aproximadamente cuando n es del orden de √M. Por eso las longitudes de hash deben considerar ataques de cumpleaños.
Una sal aleatoria y única se combina con cada contraseña antes de almacenarla mediante una función de derivación lenta. La sal no necesita ser secreta: evita que dos usuarios con la misma contraseña tengan el mismo resultado y dificulta tablas precalculadas.
La sal no reemplaza una función de derivación adecuada ni convierte una contraseña débil en una contraseña fuerte.
Algunos protocolos necesitan valores únicos o impredecibles, llamados nonces o vectores de inicialización. Reutilizarlos de manera incorrecta puede revelar relaciones entre mensajes o romper garantías de seguridad.
Las condiciones exactas dependen del modo criptográfico; no basta con elegir cualquier número aleatorio.
El siguiente ejemplo ilustra cómo obtener bytes aleatorios con la API del navegador. No implementa un sistema criptográfico completo:
function bytesAleatorios(cantidad) {
const bytes = new Uint8Array(cantidad);
crypto.getRandomValues(bytes);
return Array.from(bytes);
}
console.log(bytesAleatorios(8));Pulsa Ejecutar en un navegador compatible. Para aplicaciones reales deben usarse bibliotecas y protocolos revisados.
Simula identificadores uniformes y observa cómo aumenta la probabilidad de una colisión al crecer la cantidad de identificadores. El experimento es una versión didáctica de la paradoja del cumpleaños.
Si todas las claves de un espacio de tamaño N son igualmente probables y se prueban k claves distintas, la probabilidad de acertar es k/N. El cálculo cambia si las claves no son uniformes o si el atacante puede priorizar elecciones comunes.
Un token de sesión debe ser difícil de adivinar y, en muchos diseños, también debe expirar y quedar invalidado después de su uso. La longitud y la entropía efectiva determinan la dificultad de adivinación.
Codificar un token en hexadecimal o Base64 cambia su representación, no aumenta automáticamente la entropía.
Muchas garantías se expresan como “la probabilidad de éxito del atacante es despreciable”. Para evaluar esa afirmación hay que considerar número de intentos, tiempo, información filtrada, independencia y capacidad de cómputo.
La probabilidad aparece en generación de claves, protocolos de autenticación, firmas digitales, funciones hash, salting de contraseñas, tokens, selección de nonces, detección de fraude y análisis de ataques.
Math.random() para generar secretos.La criptografía depende de la incertidumbre correcta: claves impredecibles, valores bien utilizados y análisis de colisiones. La probabilidad permite cuantificar riesgos, pero la seguridad práctica requiere protocolos y herramientas revisados.