Skip to content

Benchmark Argon2id — Edge Function

Objetivo

Medir o desempenho real do Argon2id dentro do isolate Deno das Supabase Edge Functions para calibrar os parâmetros de produção (memory cost, time cost, parallelism).

Contexto

  • Runtime: Deno isolate com 256 MB de memória e 2s de CPU time por invocação
  • Scaling: horizontal automático — cada login simultâneo roda em isolate separado
  • Biblioteca: npm:hash-wasm@4.11.0 (WASM puro, compatível com Deno)
  • Variante: Argon2id (resistente a side-channel + GPU)

Resultados (25 de março de 2026)

Tabela consolidada (14 configurações, 5 runs cada)

#Configm (MB)tpAvg (ms)Min (ms)Max (ms)Veredicto
1OWASP mínimo1921474352🟢 VIÁVEL
2OWASP alt4511908496🟢 VIÁVEL
3OWASP alt + t24521132127142🟢 VIÁVEL
450MB t25021153147161🟢 VIÁVEL
550MB t35031205201209🟢 VIÁVEL
664MB t26421189186193🟢 VIÁVEL
764MB t36431229225237🟢 VIÁVEL
864MB t46441343333368🟢 VIÁVEL
980MB t38031274269279🟢 VIÁVEL
10100MB t210021306297325🟢 VIÁVEL
11128MB t212821378374385🟢 VIÁVEL
1264MB t56451🔴 CRASH
13100MB t310031🔴 CRASH
14128MB t312831🔴 CRASH

Teto real do isolate

DimensãoLimite encontrado
Memória máxima viável128 MB (50% da RAM do isolate)
Iterações máximas a 64MB4 (t=5 crashou)
Iterações máximas a 128MB2 (t=3 crashou)
Produto m×t máximo seguro~260.000 KB·iter

Configuração de produção escolhida

m = 131.072 KB (128 MB) | t = 2 | p = 1
Tempo médio: 378ms | 19% do CPU budget
Resistência: 6,7× OWASP mínimo

Configurações testáveis

p=1 porque isolates Deno são efetivamente single-thread; p>1 gasta CPU sem paralelismo real.

Critérios de avaliação

ClassificaçãoCritério
🟢 VIÁVELavg_ms < 800 e todas as runs com sucesso
🟡 MARGINALavg_ms entre 800 e 1500, todas com sucesso
🔴 INVIÁVELavg_ms > 1500 ou qualquer run com falha

Regra: escolher a configuração com maior m que seja VIÁVEL.

Como executar

Via script local (recomendado)

bash
# Windows CMD
set SUPABASE_URL=https://mjvuzsizjlcalyfmbquy.supabase.co
set CRON_SECRET=<valor do Supabase Secrets>
node scripts/benchmark-argon2.mjs

O script:

  1. Chama a Edge Function diretamente no Supabase (bypassa Cloudflare Worker)
  2. Autentica via header X-Cron-Secret
  3. Imprime tabela resumida no terminal
  4. Salva JSON completo em scripts/resultados/benchmark-argon2_<timestamp>.json

Flags CLI

FlagExemploDescrição
--m=<KB>--m=131072Memory cost em KB
--t=<N>--t=2Time cost (iterações)
--p=<N>--p=1Parallelism (default: 1)
--runs=<N>--runs=5Quantidade de runs (default: 3)
--all--allRoda todas as 7 configs padrão
--help--helpMostra ajuda

Exemplos de uso

bash
# Testar a config de produção
node scripts/benchmark-argon2.mjs --m=131072 --t=2

# Testar com mais runs para maior precisão
node scripts/benchmark-argon2.mjs --m=131072 --t=2 --runs=10

# Rodar todas as 7 configs padrão
node scripts/benchmark-argon2.mjs --all

Segurança

  • Admin logado: autenticação via cookie olp_auth + requireRole('administrador')
  • Script local: autenticação via header X-Cron-Secret (mesmo padrão dos cron jobs)
  • Sandbox/CI: autenticação via Authorization: Bearer <SERVICE_ROLE_KEY>
  • Endpoint não é público — sempre requer uma das autenticações

Proposta de Cache (Upstash Redis)

Para evitar re-computar Argon2id em restaurações de sessão:

  • Upstash Redis Free Tier: 10.000 cmd/dia, 256MB, $0/mês
  • Cache armazena session ID opaco (nunca senhas/hashes)
  • Cache HIT: ~50ms | Cache MISS: ~435ms (hash completo)
  • Detalhes: docs/security/PASSWORD_HASHING_ARCHITECTURE.md

Arquivo da Edge Function

supabase/functions/benchmark-argon2/index.ts

Referências