Poucas ligações.
Qualquer plataforma.
Identity Layer integra-se com superfície mínima por design. MicroPython em um microcontrolador de € 10, Flutter em Android e Windows, ou uma PHP bridge colocada em seus endpoints existentes. O mesmo protocolo. As mesmas garantias criptográficas. Quatro chamadas.
Inicialize para verificado. 6,5 segundos.
O mesmo protocolo de desafio/resposta Ed25519 que autentica um usuário móvel ou um operador regulamentado funciona com um microcontrolador de 10 euros. Chave vinculada ao dispositivo. Nenhum banco de dados de credenciais. JWT emitido na verificação.
IdentityIoT,
instalado via mip.
# Install via mip — no external dependencies # import mip; mip.install("github:wide/identity-micropython") from identity_iot import IdentityIoT # 1. Init — configure node identity identity = IdentityIoT( base_url = cfg['base_url'], node_type = cfg['node_type'], tenant_id = cfg['tenant_id'], comm_key = cfg['comm_key'].encode(), comm_iv = cfg['comm_iv'].encode(), ) # 2. Register — device-bound key, runs once identity.ensure_registered() # 3. Authenticate — Ed25519 challenge / verify / JWT token = identity.authenticate() # 4. Authenticated request — AES-256-GCM encrypted payload response = identity.post_encrypted({'request': 'record_sensor_data', 'value': 42})
| Componente | Modelo | Função |
|---|---|---|
| UCM | Raspberry Pi Pico 2W (RP2350) | TrustZone, WiFi, armazenamento de chaves vinculado ao dispositivo |
| Leitor NFC | PN532 | Interface I2C, lê emblemas de DNA NTAG424 |
| Exibição | SSD1306 128x64 OLED | Sequência de inicialização, status de verificação |
| Selo NFC | NTAG424 DNA (NXP) | AES-128 integrado, chaves não exportáveis, CMAC dinâmico |
Identidade vinculada ao dispositivo.
Quatro chamadas.
Pacotes locais. Nenhum serviço de identidade externo. A chave privada nunca sai do dispositivo.
Armazenamento seguro via flutter_secure_storage
e TEE/Enclave Seguro quando disponível.
A criptografia de payload é de ponta a ponta via ITEMSEncrypter.
// 1. Init — JWT identity, silent on subsequent boots final auth = IdentityAuthServiceStd(ITEMSGlobals.authURI); await auth.ensureJwt( preferredLocale: locale.languageCode, utcOffsetMin: DateTime.now().timeZoneOffset.inMinutes, ); // 2. Handshake — silent if identity already present on device final result = await api.mjHandshake( identityHash: identityHash, publicKey: publicKey, ); // 3. Store JWT — session active, no password, no credential database await _storage.write(key: 'token', value: result['token']); // 4. Every request — AES-256-GCM payload, end-to-end encrypted final response = await api.postEncrypted({'request': 'your_request'});
dependencies: # Identity Layer — local packages, no external registry identity_package: path: packages/identity_package identity_std: path: packages/identity_std identity_hs: path: packages/identity_hs items_crypto: path: packages/items_crypto
| Plataforma | Estado | Armazenamento seguro |
|---|---|---|
| Android | Produção, Google Play liberado | Armazenamento de chaves do Android/TEE |
| Windows | Produção, Microsoft Store liberada | Gerenciador de credenciais do Windows |
| Linux | Produção | libsecret |
| iOS / macOS | No roteiro | Enclave Seguro |
5KB.
Sua pilha, inalterada.
A PHP bridge é um requisito único que fica na frente de seus endpoints existentes. Suas rotas, seu banco de dados, sua lógica de negócios. Intocado.. Identity Layer lida com autenticação e criptografia de payload. Remova-o da mesma forma que você o adicionou.
require_once
e duas chamadas de função. Seus endpoints começam a receber cargas verificadas e descriptografadas.
Nenhuma migração de esquema. Nenhuma alteração na tabela do usuário. Sem armazenamento de sessão.
A pilha completa do lado do servidor é 225 KB.
// 1. Include the Identity Layer bridge — 5 KB require_once 'identity/_mj_auth.php'; // 2. Authenticate — JWT verified, identity_hash extracted // identity_hash is a 64-char SHA-256 hex — never a user ID [$identityHash, $tenantId, $claims, $role] = mj_authenticate_identity($encoder); // 3. Every response — AES-256-GCM encrypted, end-to-end sendEncryptedResponse($encoder, [ 'status' => 'ok', 'data' => $yourData, ], ['ts' => time()], 200);
mj_mandate_log ponto final
registra o mandate e abre uma janela de exportação de 72 horas.
Os logs são destruídos após a coleta. A autoridade requerente tem responsabilidade legal.
// Requires role = admin — never operator [$userId, $tenantId, $claims, $role] = mj_authenticate($encoder); mj_require_role($encoder, $claims, 'admin'); // Register mandate — opens 72h export window // target_identity_hash: 64-char SHA-256, never plaintext identity // Ciphertext is never stored — metadata only $connector->executeDatabaseParameterQuery( "INSERT INTO audit_log (mandate_number, issuing_country, issuing_court, target_identity_hash, export_status) VALUES (?, ?, ?, ?, 'PENDING')", [$mandateNumber, $issuingCountry, $issuingCourt, $targetHash], $db );
| Componente | Tecnologia | Notas |
|---|---|---|
| Tempo de execução | PHP 8.x | Baunilha, nenhuma estrutura necessária |
| Banco de dados | MySQL / MariaDB | Esquema padrão, sem colunas de credenciais |
| Cache / ephemeral | Redis | Tokens de desafio, filas de mensagens (TTL <1 min) |
| Tamanho da ponte | 5 KB | Arquivo PHP único, colocado em qualquer pilha LAMP |
| Tamanho total da pilha | 225 KB | Identity STD + HS + Chaves + Secure Channel + IoT + Etiquetas + Tag |
| Implantação | Contêiner / no local / com isolamento de ar | Sem conectividade obrigatória à nuvem |