Números aleatorios


en Node.js

Alejandro Fernández


Desarrollador Senior en MediaSmart Mobile

Consultor de Escalabilidad

@pinchito

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:
  1. adj. Perteneciente o relativo al juego de azar
  2. 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:

Diehard

Dieharder

NIST

TestU01

Números


Pseudo-aleatorios

Generación por ordenador



Any one who considers arithmetical methods of producing random digits is, of course, in a state of sin.

John von Neumann

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


“We cannot trust” Intel and Via’s chip-based crypto

Devs de FreeBSD

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!

@pinchito