La criptografía es segura siempre que las hipótesis de funcionamiento se cumplan, y una de ellas es que se está generando números aleatorios con una fuente RNG ó PRNG criptográfica
¿Para generar claves hemos de utilizar PRNG o RNG? Mejor RNG pero si no está disponible podemos usar PRNG a condición que:
Fuente: NIST: Recommendation for Key Management: Part 1 Rev. 5 (2020)
Usados en HSM, SmartCards, algunas CPUs...
Una resistencia a temperatura ambiente tiene electrones libres que se mueven aleatoriamente (carga negativa) y podemos medir el desequilibrio momentáneo con un conversor Analógico/Digital
El conversor dará una secuencia indefinida de bits aleatorios
Con una fuente de luz apuntamos a un espejo semireflectante; dos fotodetectores detectan uno u otro el fotón de forma totalmente aleatoria
Ambas fuentes de ruido generan valores aleatorios pero no uniformes
En Linux (Ubuntu) tenemos dos fuentes random:
/dev/random
: salida RNG basada en I/O. Flujo lento en el rango de bps/dev/urandom
: unblocking random, salida PRNG (ChaCha20) enriquecida con /dev/random
. Flujo en el rango de MbpsEn otros Linux tenemos diferentes combinaciones de /dev/random
y con aleatoriedad obtenida de diferentes fuentes
Hardware Secure Module
las funciones de un HSM son:
Para implementar las funciones anteriores hace falta:
Los HSM pueden ser certificados según FIPS 140-2 en diferentes niveles:
The security requirements cover areas related to the secure design and implementation of a cryptographic module. These areas include cryptographic module specification; cryptographic module ports and interfaces; roles, services, and authentication; finite state model; physical security; operational environment; cryptographic key management; electromagnetic interference/electromagnetic compatibility (EMI/EMC); self-tests; design assurance; and mitigation of other attacks.
para gestionar claves de usuarios para firma avanzada : FIPS 140-2 nivel 2
para autoridades de validación o de sello de tiempo : FIPS 140-2 nivel 2
para autoridades de certificación : FIPS 140-2 nivel 3
PKCS #11 es una especificación de la API de los HSM en lenguaje C (literalmente un .h)
PKCS: Public Key Cryptographic Standard. Estándares de facto publicados por RSA Labs. Inc. (ahora EMC2 (ahora Dell Technologies)); actualmente la gestión del estándar ha pasado a OASIS
En claves importantes (e.g. la de una CA raíz) un HSM puede no ser suficiente (¿y si lo roban?)
En estos casos podemos dividir la clave en trozos:
¿Lo podemos hacer "por software"?
Sí, pero el secreto ha estado "en claro" en la RAM del ordenador por tanto una vez recuperado el secreto su exposición ha aumentado notablemente
Pero en HSM es una propiedad habitual
La reducción de parámetros implica reducir el ancho de banda: generar números aleatorios es lento porque hay que esperar a tener datos de UI
En Linux, casi siempre os interesará leer de urandom: leer de random es muy lento y puede bloquearse, esperando a tener suficientes eventos