Få samtal.
Vilken plattform som helst.
Identity Layer integreras med minimal yta genom design. MicroPython på en mikrokontroller, Flutter på Android och Windows, eller en PHP bridge släpptes till dina befintliga slutpunkter. Samma protokoll. Samma kryptografiska garantier. Fyra samtal.
IdentityIoT,
installeras 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})
| Komponent | Modell | Roll |
|---|---|---|
| MCU | Raspberry Pi Pico 2W (RP2350) | TrustZone, WiFi, device-bound nyckellagring |
| NFC reader | PN532 | I2C-gränssnitt, läser NTAG424 DNA märken |
| Visa | SSD1306 128x64 OLED | Startsekvens, verifieringsstatus |
| NFC badge | NTAG424 DNA (NXP) | AES-128 ombord, icke-exporterbara nycklar, dynamiska CMAC |
Identity IoT noder är inte begränsade till NFC åtkomst. Samma autentiserade node kan bära vilken sensor som helst. Alla avläsningar sänds via AES-256-GCM krypterad POST efter att node erhållit sin JWT.
| Sensortyp | Typisk hårdvara | Nyttolastfält |
|---|---|---|
| Temperatur | DHT22, DS18B20, BME280 | temperatur (flyta, °C) |
| Fuktighet | DHT22, BME280 | luftfuktighet (flyta, %) |
| Tryck | BME280, BMP390 | tryck (flyta, hPa) |
| PIR-rörelse | HC-SR501 | rörelse (bool) |
| GPS | NEO-6M, L76X | lat, lon, höjd (flyta) |
| Energimätning | PZEM-004T, INA219 | spänning, ström, effekt (float) |
| NFC åtkomst | PN532 + NTAG424 DNA | badge_uid, beviljad (bool) |
{ "node_uid" : "273ec83a-84c8-4967-aafa-0780ab161cc1", "tenant_id" : "0b3cfe4d-fdf7-46c2-bd41-b533da415dd9", "node_type" : "sensor", "temperature": 24.3, "humidity" : 58.1, "pressure" : 1013.2, "updated_at" : "2026-06-09 11:42:07" }
Badge läst. Utmaning utfärdad.
Ed25519 verifierad.
Identity Tag är applikationslagret som är byggt ovanpå Identity IoT. Varje badge läsning utlöser en hel Ed25519 challenge/response cykel mot backend. Inga lagrade hemligheter på reader. Ingen klartextidentitet på badge. Multi-tenant genom design.
# 1. Reader reads NTAG424 DNA NDEF payload # Fields: epk (encrypted private key), df2 (DEK fragment 2), mode (STD|HS) # 2. DEK reconstruction dek = df1_from_config XOR df2_from_badge # 3. Decrypt badge private key badge_privkey = AES_CBC_decrypt(dek, epk) # 4. Request challenge from backend challenge = POST identity_tag/it_request_challenge # { node_uid, badge_uid, tenant_id } # 5. Sign challenge with badge key (Ed25519) signature = ed25519_sign(badge_privkey, challenge_nonce) # 6. Verify at backend result = POST identity_tag/it_verify_badge # { challenge_id, signature_b64 } -> { granted: true } # 7. Reader actuates relay (GRANTED) or displays DENIED
| Läge | Beskrivning | Användningsfall |
|---|---|---|
| STD | Badge fungerar på vilken terminal som helst i den auktoriserade flottan för den tenant. | Tillgång till kontor, allmänna ingångspunkter. |
| HS | Badge kryptografiskt bunden till en specifik terminal. DEK härledningen innehåller en hash av terminalens publika nyckel. Badge är ogiltigt på alla andra reader. | Högsäkerhetsrum, datacenterställ, utrustningsskåp. |
| Slutpunkt | Metod | Roll |
|---|---|---|
| identity_tag/it_request_challenge | POST | Problem nonce för badge verifiering |
| identity_tag/it_verify_badge | POST | Verifiera Ed25519 signatur, returnera GRANTED/DENIED |
| identity_tag/it_node_checkin | POST | Node hjärtslag och JWT uppdatering |
| identity_tag/it_register_badge | POST (manager) | Skriv badge offentlig nyckel och behörighet |
| identity_tag/it_list_nodes | GET (manager) | Node flotta status för tenant |
Provisionerings- och hanteringsappen körs på Android. Den använder enhetens NFC för att skriva badge nyttolaster och ansluter till backend över autentiserade Identity Layer-kanaler.
// identity_tag package - badge provisioning final writer = IdentityTagWriter(api: tagApi); // Generate badge keypair and encrypt private key with split DEK final payload = await writer.prepareBadgePayload( tenantId : tenant.id, mode : BadgeMode.STD, // or BadgeMode.HS nodeUid : null, // required for HS mode ); // Write NDEF to NTAG424 DNA via flutter_nfc_kit await writer.writeToTag(payload);
Enhetsbunden identitet.
Fyra samtal.
Lokala paket. Ingen extern identitetstjänst. Den privata nyckeln lämnar aldrig enheten.
Säker förvaring via flutter_secure_storage
och TEE / Secure Enclave när de är tillgängliga.
Nyttolastkryptering sker från ända till ända 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
| Plattform | Status | Säker förvaring |
|---|---|---|
| Android | Produktion, Google Play rensad | Android Keystore / TEE |
| Windows | Produktion, Microsoft Store rensad | Windows Credential Manager |
| Linux | Produktion | libsecret |
| iOS / macOS | På färdplanen | Secure Enclave |
5 KB.
Din stack, oförändrad.
PHP bridge är ett enda krav som sitter framför dina befintliga slutpunkter. Dina rutter, din databas, din affärslogik. Orörd.. Identity Layer hanterar autentisering och nyttolastkryptering. Ta bort den på samma sätt som du lade till den.
require_once
och två funktionsanrop. Dina slutpunkter börjar ta emot verifierade, dekrypterade nyttolaster.
Ingen schemamigrering. Inga ändringar i användartabellen. Ingen sessionslagring.
Den kompletta stacken på serversidan är 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 slutpunkt
registrerar fullmakten och öppnar ett 72-timmars exportfönster.
Loggar förstörs efter insamling. Den begärande myndigheten bär det juridiska ansvaret.
// 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 );
| Komponent | Teknologi | Anteckningar |
|---|---|---|
| Körning | PHP 8.x | Vanilj, ingen ram krävs |
| Databas | MySQL / MariaDB | Standardschema, inga autentiseringskolumner |
| Cache / efemär | Redis | Utmaningstokens, meddelandeköer (TTL < 1 min) |
| Brostorlek | 5 KB | Enstaka PHP-fil, släpp i valfri LAMP-stack |
| Full stack storlek | 225 KB | Identitet STD + HS + Nycklar + Secure Channel + IoT + Etiketter + Tag |
| Spridning | Behållare / på plats / air-gapped | Ingen obligatorisk molnanslutning |