PRNGs criptograficamente seguros
Explore /dev/urandom, ChaCha20-CSPRNG e Fortuna.
PRNGs criptograficamente seguros é uma aula grátis de Cryptology Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Cryptology Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Cryptology Academy inclui 4 aulas no total.
Recapitulação dos requisitos de CSPRNG
Um CSPRNG deve satisfazer: (1) imprevisibilidade do próximo bit — mesmo conhecendo todos os bits anteriores, o próximo bit não pode ser previsto com probabilidade > 1/2 + desprezível; (2) resistência à extensão após comprometimento do estado — conhecer o estado atual não revela nada sobre a saída passada.
/dev/urandom e getrandom()
O Linux /dev/urandom usa um CSPRNG inicializado a partir do reservatório de entropia. Após a inicialização inicial (128 bits de entropia), é seguro usá-lo mesmo quando o reservatório está "vazio" — o CSPRNG mantém seu próprio estado interno. getrandom() é o equivalente moderno à chamada de sistema.
CSPRNG baseado em ChaCha20
O kernel do Linux 5.17+ substituiu seu CSPRNG por um projeto baseado em ChaCha20. ChaCha20 é rápido (não requer aceleração de hardware), oferece segurança de 256 bits e tem uma prova de segurança bem estabelecida. O nonce é o contador; a chave vem do reservatório de entropia.
Fortuna
Fortuna (Ferguson e Schneier, 2003) é um projeto de CSPRNG que mantém 32 reservatórios de entropia e acumula entropia continuamente. O gerador recebe uma nova semente dos reservatórios à medida que eles se enchem. É resistente a ataques de redefinição do RNG e de comprometimento parcial do estado.
Backdoor do DUAL_EC_DRBG
O NIST SP 800-90A originalmente incluía o DUAL_EC_DRBG, baseado em curvas elípticas. Documentos de Snowden revelaram que a NSA inseriu uma porta dos fundos: os pontos EC foram escolhidos de modo que a NSA pudesse prever a saída a partir de qualquer semente. Nunca use DUAL_EC_DRBG. O NIST o removeu em 2014.
CTR_DRBG
O CTR_DRBG (NIST SP 800-90A) usa AES no modo contador como CSPRNG. Semente = chave de 256 bits + nonce de 128 bits. Cada chamada avança o contador. É amplamente implementado no OpenSSL, no BoringSSL e no BCrypt do Windows. Há aceleração de hardware em CPUs com AES-NI.
HASH_DRBG e HMAC_DRBG
O HASH_DRBG usa uma função de hash (SHA-256) iterativamente com um valor de semente. O HMAC_DRBG usa HMAC para realizar a mistura. O HMAC_DRBG é mais simples de implementar corretamente e é usado em muitos sistemas embarcados (mbedTLS, WolfSSL).
Resemeadura e injeção de entropia
Até mesmo os CSPRNGs precisam ser re-semeados periodicamente. O CTR_DRBG tem um intervalo de re-semeadura de 2^48 solicitações. O Fortuna recebe novas sementes de seus reservatórios de entropia. Re-semeadura manual: adicione entropia nova (bytes obtidos com getrandom) ao estado do CSPRNG na inicialização e após fork().
O problema do fork
Quando um processo executa um fork, o processo pai e o processo filho herdam o mesmo estado do CSPRNG — eles produzirão uma saída idêntica. Correção: chame getrandom() para re-semear imediatamente após fork(). O OpenSSL faz isso automaticamente por meio de pthread_atfork() nas versões recentes.
CSPRNG na prática: Python
import secrets key = secrets.token_bytes(32) # chave de 256 bits nonce = secrets.token_bytes(12) # nonce de 96 bits para AES-GCM pin = secrets.randbelow(10**6) # PIN de 6 dígitos # Nunca use o módulo random para criptografia
Criptografia no navegador
window.crypto.getRandomValues(typedArray) é o CSPRNG do navegador. Ele chama a fonte de entropia do OS. É usado pela API WebCrypto para a geração de chaves. Nunca use Math.random() para segurança — ele é um PRNG não criptográfico inicializado a partir do horário do sistema.
Verificação rápida
Qual módulo do Python você deve usar para gerar bytes aleatórios criptográficos?
Resumo
CSPRNGs como ChaCha20, CTR_DRBG e Fortuna geram saídas imprevisíveis a partir de sementes de entropia. Evite DUAL_EC_DRBG, random.random() e Math.random(). Use secrets (Python) ou window.crypto (navegador). A seguir: falhas de entropia no mundo real.
Perguntas Frequentes
A aula “PRNGs criptograficamente seguros” é grátis?
Sim — o texto completo de “PRNGs criptograficamente seguros” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Cryptology Academy, atualize para CoddyKit PRO. O curso de Cryptology Academy inclui 4 aulas no total.
O que vou aprender em “PRNGs criptograficamente seguros”?
Explore /dev/urandom, ChaCha20-CSPRNG e Fortuna. Você pratica Cryptology Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Cryptology Academy?
Nenhuma experiência prévia é necessária. Cryptology Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “PRNGs criptograficamente seguros”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Cryptology Academy?
Sim. Cada aula de Cryptology Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Aleatoriedade verdadeira versus pseudoaleatoriedade
- PRNGs criptograficamente seguros
- Esgotamento de entropia e erros de chaves fracas
- Geração segura de chaves, nonces e IVs