CSPRNG com Web Crypto API: Geração de Entropia Segura
Aprenda a gerar números e strings criptograficamente seguras com a Web Crypto API e algoritmos CSPRNG no navegador em 2026.

A implementação de CSPRNG com a Web Crypto API estabeleceu-se em 2026 como a base técnica indispensável para a criação de autenticadores WebAuthn, geradores de senhas e sistemas de emissão de tokens. Apesar dos alertas dos padrões de cibersegurança, o uso indevido de geradores fracos como Math.random() permanece como causa recorrente de previsibilidade em tokens de recuperação de conta.
Um gerador de números pseudoaleatórios criptograficamente seguro (CSPRNG) exige conformidade estrita com o teste do próximo bit (Next-Bit Test): nenhum algoritmo deve conseguir prever o bit seguinte com probabilidade superior a 50%.
Fontes de Entropia Física e o Motor Web Crypto
Nos navegadores atuais, Node.js e Deno, os métodos crypto.getRandomValues() e crypto.randomUUID() acessam as primitivas nativas do sistema operacional:
- Linux / Android:
/dev/urandome chamadagetrandom(). - Windows:
BCryptGenRandomda API CNG. - macOS / iOS:
CCRandomGenerateBytes.
Essas interfaces agregam ruído físico de interrupções de hardware, sensores térmicos e tráfego de rede.
Para gerar senhas com alta entropia matemática processadas 100% no cliente, utilize nosso Gerador de Senhas Seguras.
Tabela Comparativa: PRNG vs CSPRNG Criptográfico
| Propriedade de Segurança | Math.random() (PRNG) |
crypto.getRandomValues() (CSPRNG) |
|---|---|---|
| Algoritmo Base | xorshift128+ / Mulberry32 | ChaCha20 / AES-CTR-DRBG (NIST SP 800-90A) |
| Origem da Entropia | Semente estática ou timestamp | Pool físico do kernel do sistema |
| Resistência a Previsão | Nula (previsível em poucas saídas) | Criptograficamente invulnerável ($2^{128}$) |
| Resiliência de Estado | Inexistente | Proteção contra backtracking |
| Aplicações Adequadas | Animações visuais, jogos, testes | Chaves criptográficas, tokens, UUIDs |
Implementação Sem Viés (Rejection Sampling) em TypeScript
O equívoco mais frequente reside no uso do operador de módulo (% max) para restringir valores a um intervalo, introduzindo viés de módulo.
Abaixo demonstra-se a técnica correta por amostragem com rejeição:
export function getSecureRandomInt(max: number): number {
if (max <= 0 || max > 0xFFFFFFFF) {
throw new Error('O valor max deve estar entre 1 e 2^32 - 1');
}
const randomBuffer = new Uint32Array(1);
const maxUint32 = 0x100000000;
const limit = maxUint32 - (maxUint32 % max);
let randomValue: number;
do {
crypto.getRandomValues(randomBuffer);
randomValue = randomBuffer[0];
} while (randomValue >= limit);
return randomValue % max;
}
export function generateSecureToken(length: number): string {
const charset = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+';
let token = '';
for (let i = 0; i < length; i++) {
token += charset[getSecureRandomInt(charset.length)];
}
return token;
}
Essa função assegura que cada caractere tenha probabilidade idêntica de seleção.
Recomendações de Criptografia no Cliente
Para implementar rotinas confiáveis:
- Limite de Buffer: O método
crypto.getRandomValues()permite até 65.536 bytes por invocação. - Identificadores Únicos: Adote
crypto.randomUUID()em conjunto com nosso Gerador de UUID e ULID. - Medição de Entropia: Verifique a solidez de suas credenciais com o Verificador de Senhas.
- Hashes Seguros: Aplique funções criptográficas conforme o nosso guia de Geração de Hashes SHA-256.
- Autenticação FIDO2: Integre chaves físicas de acordo com Passkeys e Autenticação Sem Senha.
Resumo
A aleatoriedade previsível fragiliza sistemas de autenticação. A substituição definitiva por crypto.getRandomValues() e algoritmos sem viés assegura máxima proteção criptográfica.
Ataques Práticos de Reconstrução de Estado em Geradores Fracos
Para compreender o risco do Math.random(), analise o algoritmo xorshift128+. O gerador mantém um estado interno de 128 bits distribuído em dois inteiros de 64 bits (s[0] e s[1]).
Como cada chamada a Math.random() expõe diretamente os 53 bits mais significativos na mantissa do número de ponto flutuante, um invasor que capture 2 ou 3 valores consecutivos pode montar um sistema linear sobre o corpo finito GF(2) e solucionar o estado interno completo em menos de 10 milissegundos por eliminação gaussiana.
export async function generateHmacSecretKey(): Promise<CryptoKey> {
return await window.crypto.subtle.generateKey(
{
name: 'HMAC',
hash: { name: 'SHA-256' }
},
true,
['sign', 'verify']
);
}
Certificação Estatística com NIST SP 800-22 e Dieharder
Para validar a solidez estatística de rotinas criptográficas, as sequências são submetidas às baterias NIST SP 800-22 e Dieharder: teste monobit, teste de sequências (Runs Test) e teste de posto de matrizes binárias.
Normas:
- NIST SP 800-90A: Recommendation for Random Number Generation.
- W3C Web Cryptography API.
- Artigo TecnoCrypter: Entropia Matemática e Senhas.


