Números aleatorios
en Node.js
Alejandro Fernández
Desarrollador Senior en MediaSmart Mobile
Consultor de Escalabilidad
Vamos a ver hoy
¿Qué es aleatorio?
Números pseudo-aleatorios
Sesión práctica: adivina un número
Seguridad y aleatoriedad
Sesión praćtica: tokens
¿Qué es aleatorio?
Randall Munroe: xkcd #1210
Aleatorio
RAE:
- adj. Perteneciente o relativo al juego de azar
- adj. Dependiente de algún suceso fortuito
Que depende de la suerte
Sin método ni regla
Que no puede ser predicho
Que contiene máxima información
¿Para qué hacen falta?
Simulaciones científicas
(e.g. Método de Montecarlo)
Aplicaciones de juegos
Selección de jurados
Seguridad
Generación por hardware
Circuito que genera ruido
Se calibra y filtra en ejecución
No se puede usar directamente
Generación rápida
Tests de Aleatoriedad
¿Cómo saber si algo es aleatorio?
Definición negativa
Múltiples suites:
Números
Pseudo-aleatorios
Generación por ordenador
John von NeumannAny one who considers arithmetical methods of producing random digits is, of course, in a state of sin.
Algoritmos de PRNG
(Pseudo-Random Number Generator)
Algoritmo
(e.g. Mersenne Twister)Semilla
(e.g. el timestamp actual)
(o mejor, un valor aleatorio de verdad)
¿Cómo de Pseudo?
PHP rand() en Windows
Sesión práctica: Adivina un número
Selecciona un número aleatorio entre 1 y 6
Pide un número al usuario
Si falla, avísale y sigue
Si acierta, termina
Math.random()
Función común de JavaScript
Devuelve un número de [0, 1)
Usa su propia semilla
Fuente: MDN
Escalado
De [0, 1) a [1, 7)
Success!
Seguridad
y aleatoriedad
Infinitos usos
Tokens aleatorios
Claves de sesión
One-time pads
Sal para contraseñas
Unix
/dev/random
Devuelve bytes aleatorios
Acumula "entropía" del exterior
La pierde al reiniciar
Bloquea en Linux (no en Mac OS X)
/dev/urandom
Generador pseudoaleatorio
Usa semilla segura
Fuente inagotable de compromisos
Insuficiente aleatoriedad
Especialmente tras reinicios (routers)
Semillas reutilizadas (BitCoin en Android)
Vectores no inicializados (WEP)
Puerta trasera en Linux
"Have any of you been approached
by the US for a backdoor?"
"Not that I can talk about"
Vídeo
Fortuna
Almacena entropía de diversas fuentes
La va pasando entre "pools" internos
Sucesor de Yarrow (Windows)
Resiste tras reinicios
Fuente: Schneier.com
Y no sólo en software
¿Dónde insertarías una puerta trasera en un chip?
Respuesta: en el generador de números pseudo-aleatorios
Devs de FreeBSD“We cannot trust” Intel and Via’s chip-based crypto
Sesión práctica: tokens
Generar un token aleatorio para cada usuario
Se almacenará en cookie o en código cliente
El token permite el acceso a datos de usuario
El token no debe poderse adivinar
Crypto.randomBytes()
Devuelve un número de bytes aleatorios
Es segura criptográficamente
No compatible con browsers
Bloquea (en teoría)
Fuente: Crypto
¡Tachán!
¿Qué hemos aprendido hoy?
Entropía
→ difícil
Números aleatorios → difíciles
Usos seguros: funciones seguras
Semilla aleatoria, algoritmo PRNG
No te la juegues
¡Gracias!
Números Aleatorios en Node.js
By Alex Fernández
Números Aleatorios en Node.js
Charla para Node.js Madrid, 2014-12-16: http://www.meetup.com/Node-js-Madrid/events/219061183/
- 4,824