PRNG, que agrega las siguientes características: • Salida indistinguible de una fuente real de números aleatorios • No es posible predecir la secuencia de bits
casinos debido a incorrecta elección de PRNG Casos de llaves débiles por mal uso de RNG Vulnerabilidad de RNG de Android - Wallets de Bitcoin con claves privadas débiles
- combina fuentes de HWRNG (TPM, RDRAND, virtio, RasPi SoC) haveged - implementa HArdware Volatile Entropy Gathering and Expansion Usa estado interno de CPU como fuente de entropía Útil para entornos donde no hay hardware disponible (p.ej. VMs) Caveat: Virtualización de la instrucción rdtsc puede disminuir la calidad de la generación
y proveedores dependen de la implementación del JRE instalado SecureRandom random = new SecureRandom(); byte bytes[] = new byte[20]; random.nextBytes(bytes);
Linux: https://lwn.net/Articles/525459/ Java: https://docs.oracle.com/javase/8/docs/api/index.html?java/security/SecureRandom.html https://www.synopsys.com/blogs/software-security/issues-when-using-java-securerandom/ .NET: https://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx Node.JS: https://nodejs.org/api/crypto.html#crypto_crypto_randombytes_size_callback JS Crypto considered harmful: https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2011/august/javascript-cryptography-considere d-harmful/ SJCL: https://github.com/bitwiseshiftleft/sjcl Charlas: How do we know our PRNGs work properly? (33c3): https://www.youtube.com/watch?v=c_CalG1rL0I (QA de PRNGs) Wheel Of Fortune (33c3): https://www.youtube.com/watch?v=brYdF-iks0Q (PRNGs en ambientes embebidos)
Explorer: window.msCrypto SJCL: https://github.com/bitwiseshiftleft/sjcl SJCL puede ser usado en Node JS, y puede consumir entropía desde crypto.getRandomValues(). Bonus Content (slides notes, cont.)