Niewiele połączeń.
Dowolna platforma.
Identity Layer integruje się z minimalną powierzchnią zgodnie z projektem. MicroPython na mikrokontrolerze za 10 €, Flutter na Androidzie i Windowsie, lub most PHP upuszczony do istniejących punktów końcowych. Ten sam protokół. Te same gwarancje kryptograficzne. Cztery połączenia.
Uruchom, aby zweryfikować. 6,5 sekundy.
Ten sam protokół wyzwania/odpowiedzi Ed25519, który uwierzytelnia użytkownika mobilnego lub regulowany operator działa na mikrokontrolerze o wartości 10 euro. Klucz powiązany z urządzeniem. Brak bazy danych uwierzytelniających. JWT wydany po weryfikacji.
IdentityIoT,
zainstalowany przez 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 | Modelka | Rola |
|---|---|---|
| MCU | Raspberry Pi Pico 2W (RP2350) | TrustZone, WiFi, przechowywanie kluczy powiązane z urządzeniem |
| Czytnik NFC | PN532 | Interfejs I2C, odczytuje plakietki DNA NTAG424 |
| Wyświetlacz | SSD1306 128x64 OLED | Sekwencja rozruchowa, status weryfikacji |
| Odznaka NFC | NTAG424 DNA (NXP) | Wbudowany AES-128, klucze nieeksportowalne, dynamiczny CMAC |
Tożsamość powiązana z urządzeniem.
Cztery połączenia.
Pakiety lokalne. Brak zewnętrznej usługi tożsamości. Klucz prywatny nigdy nie opuszcza urządzenia.
Bezpieczne przechowywanie poprzez flutter_secure_storage
i TEE / Bezpieczna enklawa, jeśli są dostępne.
Szyfrowanie ładunku odbywa się kompleksowo za pośrednictwem 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
| Platforma | Stan | Bezpieczne przechowywanie |
|---|---|---|
| Android | Produkcja, Google Play wyczyszczone | Magazyn kluczy Androida / TEE |
| Windows | Produkcja, sklep Microsoft wyczyszczony | Menedżer poświadczeń systemu Windows |
| Linux | Produkcja | libsecret |
| iOS / macOS | Na mapie drogowej | Bezpieczna enklawa |
5KB.
Twój stos bez zmian.
Most PHP to pojedynczy element wymagający, który znajduje się przed istniejącymi punktami końcowymi. Twoje trasy, Twoja baza danych, Twoja logika biznesowa. Nietknięty.. Identity Layer obsługuje uwierzytelnianie i szyfrowanie ładunku. Usuń go w ten sam sposób, w jaki go dodałeś.
require_once
i dwa wywołania funkcji. Twoje punkty końcowe zaczynają otrzymywać zweryfikowane, odszyfrowane ładunki.
Brak migracji schematu. Brak zmian w tabeli użytkowników. Brak przechowywania sesji.
Kompletny stos po stronie serwera to 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 punkt końcowy
rejestruje zlecenie i otwiera 72-godzinne okno eksportu.
Po zebraniu kłody są niszczone. Organ wzywający ponosi odpowiedzialność prawną.
// 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 | Technologia | Notatki |
|---|---|---|
| Czas wykonania | PHP 8.x | Wanilia, nie wymaga frameworka |
| Baza danych | MySQL / MariaDB | Schemat standardowy, bez kolumn danych uwierzytelniających |
| Pamięć podręczna / efemeryczna | Redis | Tokeny wyzwań, kolejki komunikatów (TTL < 1 min) |
| Rozmiar mostu | 5 KB | Pojedynczy plik PHP, upuść go na dowolnym stosie LAMP |
| Pełny rozmiar stosu | 225 KB | Identity STD + HS + klucze + Secure Channel + IoT + etykiety + tag |
| Wdrożenie | Kontener / lokalnie / z przerwą powietrzną | Brak obowiązkowej łączności z chmurą |