Мало звонков.
Любая платформа.
Identity Layer благодаря своей конструкции имеет минимальную поверхность. MicroPython на микроконтроллере стоимостью 10 евро, Flutter на Android и Windows, или мост PHP, подключенный к существующим конечным точкам. Тот же протокол. Те же криптографические гарантии. Четыре звонка.
Загрузитесь для проверки. 6,5 секунды.
Тот же протокол запроса/ответа Ed25519, который аутентифицирует мобильного пользователя. или регулируемый оператор работает на микроконтроллере стоимостью 10 евро. Ключ, привязанный к устройству. Нет базы данных учетных данных. JWT выдан при проверке.
IdentityIoT,
установлен через 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})
| Компонент | Модель | Роль |
|---|---|---|
| MCU | Raspberry Pi Pico 2W (RP2350) | TrustZone, Wi-Fi, хранилище ключей, привязанное к устройству |
| NFC-считыватель | PN532 | Интерфейс I2C, считывает бейджи ДНК NTAG424. |
| Дисплей | SSD1306 128x64 OLED | Последовательность загрузки, статус проверки |
| NFC-значок | NTAG424 DNA (NXP) | Встроенный AES-128, неэкспортируемые ключи, динамический CMAC |
Идентификация, привязанная к устройству.
Четыре звонка.
Локальные пакеты. Никакой внешней службы идентификации. Закрытый ключ никогда не покидает устройство.
Безопасное хранение через flutter_secure_storage
и TEE/Secure Enclave, если доступно.
Шифрование полезной нагрузки осуществляется сквозным способом с помощью 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
| Платформа | Статус | Безопасное хранение |
|---|---|---|
| Android | Производство, Google Play очищен | Хранилище ключей Android / TEE |
| Windows | Производство, Microsoft Store очищен | Диспетчер учетных данных Windows |
| Linux | Производство | libsecret |
| iOS / macOS | В дорожной карте | Безопасный анклав |
5 КБ.
Ваш стек не изменился.
Мост PHP , это единственное требование, которое находится перед существующими конечными точками. Ваши маршруты, ваша база данных, ваша бизнес-логика. Нетронутый.. Identity Layer управляет аутентификацией и шифрованием полезной нагрузки. Удалите его так же, как и добавили.
require_once
и два вызова функций. Ваши конечные точки начнут получать проверенные и расшифрованные полезные данные.
Никакой миграции схемы. Таблицы пользователей не изменяются. Нет хранилища сеансов.
Полный стек на стороне сервера 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 endpoint
регистрирует мандат и открывает 72-часовое окно экспорта.
Журналы уничтожаются после сбора. Запрашивающий орган несет юридическую ответственность.
// 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 );
| Компонент | Технология | Примечания |
|---|---|---|
| Время выполнения | PHP 8.x | Ваниль, фреймворк не требуется |
| База данных | MySQL / MariaDB | Стандартная схема, без столбцов учетных данных |
| Кэш/эфемерный | Redis | Токены вызовов, очереди сообщений (TTL < 1 минуты) |
| Размер моста | 5 KB | Один файл PHP, поместите в любой стек LAMP. |
| Полный размер стека | 225 KB | Identity STD + HS + Ключи + Secure Channel + IoT + Этикетки + Тег |
| Развертывание | Контейнер / локальный / с воздушным зазором | Нет обязательного подключения к облаку |