CLASSIFIED METRICS

Ecossistema iDLOCK Autenticador 2FA

Topografia de Infraestrutura, Motores Criptográficos e Defesas Resilientes.

📱 Core.APK: Dispositivo Móvel

📈

Métricas Estáticas

Source Kotlin (.kt)23 / 4.754 linhas
Assets / XML Res2.562 arquivos
Caracteres Digitados~ 250.910
Release LevelStable 1.4.73
versionCode134
compileSdk / targetSdk37 / 37
minSdkAPI 24 (Android 7.0+)

Stack Tecnológica

RuntimeKotlin 2.0
Motor Gráfico UIJetpack Compose
State EngineViewModel + Coroutines
Network I/ORetrofit + OkHttp
Image LoaderCoil Async
🌍

L10N Internacionalização

Compilado nativamente para 25 idiomas via OS Injection (100% Offline):

PT-BR PT-PT EN-GB EN-US ES-ES ES-419 FR DE IT HI BN TL FIL JA KO ZH-CN RU UK AR IN VI TH TR PL NL

🔒 Criptografia & Integridade de Dados

🧠

AES-256-CBC

Encrypt-then-MAC com Chave HMAC Derivada

Segredos TOTP blindados com AES-256-CBC + IV aleatório por operação via random_bytes(). A chave HMAC não é a mesma da criptografia: é derivada com hash_hmac('sha256', salt, masterKey). O MAC é calculado sobre IV + Ciphertext. Verificação em tempo constante com hash_equals(), eliminando Timing Attack e Padding Oracle.

🔄

Versionamento Cripto

Compatibilidade Criptográfica v1 → v2 → v3

O motor de descriptografia detecta o prefixo da string cifrada. v1 (sem HMAC) é rejeitado e logado. v2 aceita HMAC mas com derivação de chave na ordem antiga (bug corrigido). v3 é a versão segura atual.

🔐

Zero-Knowledge

Backup Recovery Key

Chave de recuperação com 256-bits de entropia via random_bytes(32) do CSPRNG do OS, convertida para base64url. Exibida uma única vez ao dono. O servidor retém apenas o hash via password_hash(PASSWORD_DEFAULT).

⏱️

TOTP RFC 6238

Cofre Gerador de Códigos

Motor gerador via HMAC-SHA1 com truncamento dinâmico e períodos de 30 segundos. O sistema é um cofre — gera códigos para uso em serviços externos, como Google Authenticator. Decodificação Base32 (RFC 4648) com tratamento de caracteres inválidos.

📦

Backup Blindado

Checksum SHA-256 + Trava por Conta

O arquivo .idlock-backup contém um checksum SHA-256 calculado sobre os serviços + identificador do dono. Na importação, o checksum é revalidado e a conta é comparada. Backups só restauram na conta de origem. Os secrets são re-criptografados: chave do servidor → chave do usuário (export) → chave do servidor (import).

📝

Auditoria de Backup

Log Forense Completo

Toda operação de backup (geração de chave, exportação, importação) é registrada com ID do usuário, IP real, ação executada e contagem de serviços afetados. Rastreabilidade completa para investigação de incidentes.

🛡️ Autenticação & Defesa Anti-Brute

🛡️

Rate Limiting

APCu Atômico + Fingerprint Composto

O identificador APCu combina IP ou conta com o SHA-256 do cookie do dispositivo: identifier | fingerprint. A chave final é hasheada com xxh3 para performance. Incremento atômico via apcu_inc() sem race condition. Fallback para MySQL em ambientes sem APCu.

🪪

Device Fingerprint

Anti-Fixation 256-bits

Cookie idlock_device_id gerado com bin2hex(random_bytes(32)) = 256-bits de entropia. Flags: SameSite=Strict, HttpOnly, Secure, 1 ano. Hash SHA-256 comparado a cada request via hash_equals(). Troca de fingerprint = logout imediato.

☁️

Cloudflare IP

Resolução Real de IP

A detecção de IP parte de REMOTE_ADDR. Headers como HTTP_CF_CONNECTING_IP e X-Forwarded-For só são aceitos quando a conexão vem de proxy confiável, evitando spoof direto contra rate limiting e logs.

🔑

Google OAuth JWT

Validação em 7 Camadas

Cada JWT passa por: 1) Verificação de assinatura via endpoint oficial do Google. 2) ISS (emissor). 3) AUD (audience Web). 4) AZP (authorized party Android). 5) EXP (expiração). 6) Nonce CSRF anti-replay. 7) email_verified. Após sucesso: session_regenerate_id(true).

🚫

JTI Anti-Replay

Reutilização do Rate Limiter

Cada JWT recebe bloqueio de reutilização via hash SHA-256 do token como identificador. A implementação reutiliza o motor de Rate Limiting com limit=1 e window=65min — eficaz, porém sem overhead de blacklist dedicada.

✉️

Google One Tap / FedCM

Login Assistido pelo Navegador

O fluxo Google Identity Services exibe contas disponíveis sem exigir navegação prévia pelo botão de login. O id_token é validado no backend com audience, issuer, expiração, nonce anti-replay e e-mail verificado antes da criação de sessão.

📱

App Android

Sessão + Device Token

O app autentica por Google OAuth e mantém acesso com device token verificado no servidor. Fluxos externos de PIN foram removidos para evitar dependência de canais fora do iDLOCK.

🧹

Limpeza Probabilística

Manutenção Sem Impacto Operacional

Rotinas de limpeza de artefatos expirados são distribuídas ao longo do tráfego real para evitar jobs pesados em momentos de pico. O objetivo é manter baixa latência sem acumular registros temporários.

👻

Cadastro Passwordless

Entrada Sem Senha Própria

Contas podem ser criadas a partir de identidade Google verificada, sem senha local do iDLOCK. Isso reduz superfície de ataque, suporte de recuperação e risco de reutilização de credenciais.

🔐 Gestão de Sessão & Cookies

🍪

Cookie __Host-

Prefixo de Segurança Máxima

O nome da sessão usa prefixo __Host- que o browser só aceita com Secure=true, Path=/ e sem Domain. Impossível de ser sobrescrito por subdomínios ou forjado via HTTP. Flags: HttpOnly, use_strict_mode ativo.

⏱️

Timeout Inteligente

Inatividade Real (não desde login)

O campo last_activity é atualizado a cada request. O timeout mede inatividade real — não tempo desde o login. Configurável por usuário: 1h, 6h, 7 dias ou 20 dias. Cookie PHP alinhado ao maior timeout para evitar logout prematuro.

🛡️

CSRF Token

256-bits + Expiração de 30 Dias

Gerado via bin2hex(random_bytes(32)) = 256-bits. Expira em 30 dias (alinhado ao maior timeout de sessão). Validação via hash_equals(). Extensões Chrome são isentas — proteção garantida pelo host_permissions do Manifest V3.

🔄

Session Regeneration

Novo ID a Cada Login

A cada login bem-sucedido: session_regenerate_id(true) invalida o ID anterior e cria um novo. Previne Session Fixation. O timeout do banco é carregado na sessão para evitar usar o default entre o login e o primeiro carregamento.

🔔

Login Push

Canal Interno Obrigatório

Cada novo login gera notificação interna/push para dispositivos vinculados. Captura: IP real, User-Agent, método de autenticação e timestamp. Parser regex detecta dispositivo (iPhone, Android, Windows, Mac) e browser (Chrome, Edge, Safari, Firefox).

🔒

OAuth Cookie

State Dual-Storage

O state do OAuth é armazenado simultaneamente em cookie (SameSite=None, Secure, HttpOnly, 10min) e em $_SESSION. Na verificação, aceita qualquer um dos dois. Proteção contra browsers que rejeitam SameSite=None.

💻 Endpoints Web & Extensões

GZIP On-The-Fly

Compressão Automática de JSON

Toda resposta JSON detecta Accept-Encoding: gzip e comprime com gzencode($json, 6). Emite Content-Encoding: gzip + Content-Length preciso. Redução real de payload sem depender de configuração do servidor.

APCu Settings Cache

RAM Cache Global (300s TTL)

URLs das lojas (Chrome, Play, Firefox, Edge, Opera) e redes sociais são cacheadas via apcu_store() com TTL de 300 segundos. Elimina uma query MySQL em cada request. Fallback transparente para query direta caso APCu indisponível.

🔢

Services Version

Sync Leve Sem Hash MD5

Em vez de buscar todos os serviços e calcular um hash MD5 a cada sync, o sistema incrementa um contador services_version no banco a cada mutação (criar/renomear/excluir). O endpoint de status retorna apenas o número — se mudou, o cliente refaz a sync.

🧩

Extension Manifest V3 v6.1.1

CSP Própria + Permissões Mínimas

CSP da extensão: script-src 'self'; object-src 'none'; base-uri 'none'. Permissões: apenas storage, alarms e activeTab. Host permissions trancadas exclusivamente em idlock.ai. Disponível para Chrome, Edge, Firefox e Opera.

🔄

Session Keep-Alive

Auto-Refresh via chrome.alarms

A extensão pinga o servidor a cada 10 minutos via chrome.alarms para manter a sessão ativa. O badge do ícone atualiza countdown TOTP também via alarms — funciona mesmo após o Service Worker ser suspenso pelo browser.

🔒

Sync Mutex

Promise-Based Race Prevention

Se o popup abre durante um sync do onInstalled, em vez de disparar uma segunda sync ou retornar dados velhos do storage, o mutex baseado em Promise faz o popup esperar pela mesma resposta. CSRF token armazenado em storage.session (RAM only — morre ao fechar o browser).

📱 Android: Barreiras Nativas

📸

FLAG_SECURE

Bloqueio Total de Captura

A flag WindowManager.LayoutParams.FLAG_SECURE é ativada na MainActivity. O sistema operacional bloqueia screenshots, gravação de tela e preview na lista de apps recentes. Zero captura visual dos códigos TOTP.

💾

EncryptedSharedPrefs

AES-256-GCM + Android Keystore

Cache local de serviços usa EncryptedSharedPreferences com MasterKey do Android Keystore. Chaves de valor: AES256_GCM. Chaves de nome: AES256_SIV. Instância singleton lazy — Keystore lido uma única vez. Dados locais ficam inacessíveis sem o hardware do aparelho.

🌐

Network Security

Cleartext Blocked + System CAs Only

O network_security_config.xml bloqueia todo tráfego cleartext (HTTP) globalmente e aceita apenas CAs do sistema. CAs adicionadas pelo usuário (Proxy Charles/Fiddler) são rejeitadas. Certificate Pinning não usado (Cloudflare rotaciona certificados sem aviso — OWASP 2025 desencoraja).

🚫

allowBackup=false

Extração ADB Estancada

O AndroidManifest define allowBackup="false" impedindo que ferramentas ADB extraiam dados do app. Combinado com EncryptedSharedPreferences, mesmo acesso físico ao device não expõe os segredos TOTP.

🖼️

Avatar Proxy

Server-Side Relay com Whitelist

Fotos de perfil do Google são buscadas pelo servidor (não pelo app). Whitelist rígida de domínios: apenas googleusercontent.com e googleapis.com. Evita vazamento de cookies e problemas de SameSite/UserAgent do Coil.

🍪

WebKit Cookie Bridge

TWA ↔ Retrofit Sharing

Interceptor OkHttp customizado sincroniza cookies entre o WebView (TWA) e as requisições Retrofit da API nativa. O header X-App-Client: android é injetado em toda request para que o servidor diferencie app vs. browser.

🤳

Biometric Auth

Credential Manager + Passkey FIDO2

Autenticação biométrica via androidx.credentials:credentials + credentials-play-services-auth. Suporte a Passkey/FIDO2 nativo via Android Credential Manager API. Impressão digital e face unlock protegem o acesso ao cofre sem expor senha ao SO.

🔔

Firebase Cloud Messaging

Push Notifications em Tempo Real

FCM integrado via firebase.messaging para notificações de segurança em tempo real (novo login detectado, sessão expirada, alerta de acesso suspeito). O token FCM é rotacionado pelo SDK automaticamente sem intervenção do servidor.

☁️

Google Drive Backup

Backup Cifrado na Nuvem Pessoal

Exportação do cofre TOTP cifrado directamente para o Google Drive do utilizador via google-api-services-drive v3 + GoogleAccountCredential. O arquivo .idlock-backup viaja já criptografado — o Google nunca vê os segredos em texto claro.

📷

ML Kit QR Scanner

Scanner Nativo Google — Zero Permissão

Leitura de QR Codes TOTP via play-services-code-scanner + mlkit:barcode-scanning:17.3.0 combinado com CameraX 1.6.0. O scanner do Google processa localmente no dispositivo, sem upload de imagem. Suporta páginas de memória de 16 KB (exigência Play 2025+).

🔄

In-App Updates

Atualização Automática via Play Store

SDK play:app-update:2.1.0 verifica e aplica actualizações silenciosamente sem tirar o utilizador do fluxo. Modo flexible update para actualizações menores; modo immediate para patches críticos de segurança.

📐

16KB Page Size

Conformidade Play Store 2025+

APK compilado com useLegacyPackaging = false e alinhamento de bibliotecas nativas a páginas de 16 KB, requisito obrigatório do Google Play a partir de 2025 para dispositivos com kernel Linux atualizado. Garante compatibilidade com Pixel 8+ e futuros flagships.

🛡️ Defesa de Borda: Security Headers

HSTS

Força HTTPS

max-age=31536000; includeSubDomains; preload

Obriga o navegador a comunicar exclusivamente via HTTPS. Registrado na lista de preload dos browsers. Protege contra ataques de downgrade SSL em redes Wi-Fi públicas.

CSP + Nonce

128-bits por request

script-src 'nonce-...' 'strict-dynamic'; frame-ancestors 'none'

Nonce gerado via base64_encode(random_bytes(16)) a cada request. strict-dynamic propaga confiança. Violações reportadas automaticamente em endpoint dedicado para monitoramento contínuo.

X-Frame-Options

Anti-Clickjacking

DENY

Proíbe que o site seja embutido em iframes de qualquer domínio. Blinda contra Clickjacking, onde atacantes engaiolam o site de forma invisível para forçar cliques em aprovações OAuth.

Referrer-Policy

Controla vazamento

strict-origin-when-cross-origin

Apenas a origem (domínio) é compartilhada em navegação cross-origin. Impede que tokens ou credenciais na URL vazem para analytics de terceiros.

Permissions-Policy

Controla hardware

camera=(self), microphone=(), geolocation=()

Câmera permitida apenas para o próprio domínio (QR Code scan). Microfone e GPS bloqueados. Scripts de terceiros não podem solicitar permissões intrusivas.

Stack Concealment

Ocultação de tecnologia

header_remove('X-Powered-By') + header_remove('Server')

Remoção ativa dos headers que expõem a stack. Cloudflare oculta o servidor de origem. Cache-Control no-store para respostas dinâmicas impede persistência de dados autenticados em disco.

COOP

Isolamento de janelas

same-origin-allow-popups

Isola a aba do site de janelas externas. Permite popups para Google OAuth. Bloqueia ataques Spectre de vazamento de memória e referência reversa por sites maliciosos.

X-Content-Type

Anti-MIME Sniffing

nosniff

Força o navegador a respeitar o Content-Type declarado. Impede execução de código malicioso camuflado como imagem (.png/.jpg) explorando MIME Sniffing.

Upload Lockdown

Uploads fora do webroot

/www/wwwroot/all/idlock/uploads

Arquivos enviados por usuários ficam fora da raiz pública do site. Mesmo com falha de regra no Nginx, não há URL direta para executar ou baixar o conteúdo.

🌐 Protocolos API & Redirect Safety

🔀

Redirect Whitelist

Open Redirect Prevention

Toda chamada de redirect valida o domínio contra whitelist rigorosa. Apenas o domínio próprio e endpoints Google OAuth. URLs protocol-relative (//) e caracteres de escape são bloqueados por regex antes de processar.

🧩

CORS Bridge

Extension Auth Segura

Extensões autenticam via cookies de sessão da web. CORS reflete a Origin exata da extensão (chrome-extension://... ou moz-extension://...) sem wildcard. Apps nativos (Android) não usam CORS — apenas header X-App-Client.

🧼

Input Sanitization

Camada Tripla

Emails: FILTER_SANITIZE_EMAIL + FILTER_VALIDATE_EMAIL. HTML: htmlspecialchars(ENT_QUOTES, UTF-8). Strings: trim(strip_tags()). Updates de usuário aceitam apenas campos de uma whitelist estrita.

📦

Zero CDN

Supply-Chain Attack Eliminado

Nenhum JavaScript, CSS ou fonte é carregado de CDNs externos. Todos os assets são self-hosted. Isso elimina o vetor de Supply-Chain Attack (comprometimento de bibliotecas em CDNs públicas) e torna Subresource Integrity (SRI) desnecessário por design — não há recurso externo para validar.

🔄

Paradoxo 2FA

Por Que Não Exigimos 2FA no Login?

O iDLOCK é o gerenciador de 2FA. Exigir outro TOTP para acessar o cofre criaria dependência circular. A segurança do acesso é garantida por Google OAuth, Passkey/WebAuthn, sessão protegida e alertas de login.

⚙️ Engenharia de Software & Resiliência

🔤

Base32 Auto-Correcção

Tolerância a Erros Humanos

Ao adicionar um serviço TOTP manualmente, o sistema corrige substituições comuns de digitação: 0→O, 1→I, 8→B, 9→P. Base32 não usa dígitos, então a correcção é silenciosa e segura. Caracteres inválidos restantes são removidos sem rejeitar o código inteiro.

🔌

PDO Reconnect Ping

Singleton com Auto-Recuperação

A conexão com o banco é um singleton por request, sem PDO::ATTR_PERSISTENT, evitando conexões presas entre ciclos do PHP-FPM. Antes de reutilizar a instância local, executa SELECT 1; cada nova conexão força timezone +00:00 e charset utf8mb4_unicode_ci.

🛡️

Mass Assignment Block

Field Whitelist Hardcoded

O método de atualização de perfil aceita um array genérico, mas filtra internamente por uma whitelist rígida de campos permitidos. Mesmo manipulando o POST diretamente, um atacante não consegue injetar campos sensíveis como flags de administrador ou hashes de chaves.

💣

ON DELETE CASCADE

Exclusão Atómica Total

A exclusão de conta executa apenas um DELETE na tabela principal. As foreign keys com ON DELETE CASCADE limpam automaticamente: serviços TOTP, tokens de autenticação, logs de login, logs de backup e categorias. Zero dados órfãos no banco.

🚨

Zero Stack Trace

Error Handling em Produção

O roteador global captura toda exceção com catch (Throwable). Em produção: loga o erro, limpa o buffer de saída e retorna mensagem genérica — nunca expõe arquivo, linha ou trace. Em debug: mostra trace estilizado. Rotas de API inexistentes retornam JSON 404, não HTML.

📊

Catálogo Crowdsourced

Ranking Orgânico de Serviços

Quando um utilizador adiciona um serviço via extensão, o sistema busca o favicon automaticamente e insere o domínio no catálogo compartilhado. Se o domínio já existe, incrementa o contador de uso. O ranking de popularidade cresce organicamente com o comportamento real dos utilizadores.

🧠 Fator Humano & UX de Segurança

🔇

Zero Erros Visíveis

UX de Segurança Sem Exposição

Conta não cadastrada nunca retorna erro público: o sistema trata a autenticação por Google OAuth ou Passkey sem expor enumeração de usuários. Isso reduz superfície de ataque sem comprometer a experiência.

🌐

i18n 11+ Idiomas

Internacionalização Nativa em Todo Ecossistema

APK: 25 idiomas nativos via OS locale injection. Web e extensão: PT-BR, EN-GB, ES-ES, HI, TL, FR, DE, IT, JA, ZH-CN e RU. A detecção de idioma usa o locale do sistema (APK) ou cookie/query-string (web). Textos jurídicos seguem a língua do utilizador.

⏱️

Idle Logout com Aviso

Proteção Contra Sessão Abandonada

O JS da dashboard detecta inatividade real (mouse, teclado, scroll, touch). 60 segundos antes do timeout, exibe toast de aviso. Timeout configurável: 1h, 6h, 7 dias ou 20 dias. Fix especial para overflow de 32-bits do V8 em sessões > 24h.

📋

Copy-to-Clipboard Seguro

TOTP Copiado e Auto-Apagado

O código TOTP é copiado via navigator.clipboard.writeText(). Um segundo toast confirma a cópia. O código não persiste no histórico da área de transferência — a exibição rotaciona a cada 30s, eliminando o risco de clipboard sniffing.

🎯

Tutorial Guiado

Onboarding em 5 Passos

Modal de tutorial interativo com navegação por dots, botões Anterior/Próximo e atalho de teclado. Introduz QR Scan, entrada manual, captura de tela e uso da extensão. Projetado para utilizadores não-técnicos sem simplificar o produto.

🖥️

Captura de Tela QR

getDisplayMedia — Zero Upload

O utilizador partilha uma aba do navegador via getDisplayMedia(). Um único frame é capturado, processado localmente com jsQR e a stream é encerrada imediatamente. Nenhum pixel é enviado ao servidor. Funciona sem câmera física.