很少有電話。
任何平台。
Identity Layer 透過設計與最小表面整合。 微控制器上的 MicroPython,Android 和 Windows 上的 Flutter, 或將 PHP bridge 放入您現有的端點。 相同的協議。相同的加密保證。四通電話。
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})
| 成分 | 模型 | 角色 |
|---|---|---|
| 單晶片 | Raspberry Pi Pico 2W (RP2350) | TrustZone、WiFi、device-bound 密鑰存儲 |
| NFC reader | PN532 | I2C 接口,讀取 NTAG424 DNA 徽章 |
| 展示 | SSD1306 128x64 OLED | 啟動順序、驗證狀態 |
| NFC badge | NTAG424 DNA(恩智浦) | AES-128 板載、不可匯出金鑰、動態 CMAC |
Identity IoT 節點不限於 NFC 存取。相同的經過身份驗證的 node 可以攜帶任何感測器有效負載。 在 node 取得其 JWT 後,所有讀數均透過 AES-256-GCM 加密 POST 傳送。
| 感測器類型 | 典型硬體 | 有效負載字段 |
|---|---|---|
| 溫度 | DHT22、DS18B20、BME280 | 溫度(浮點數,°C) |
| 濕度 | DHT22,BME280 | 濕度(浮點數,%) |
| 壓力 | BME280、BMP390 | 壓力(浮動,hPa) |
| 被動紅外線運動 | HC-SR501 | 運動(布爾) |
| 全球定位系統 | NEO-6M、L76X | 緯度、經度、海拔高度(浮動) |
| 電能計量 | PZEM-004T,INA219 | 電壓、電流、功率(浮點) |
| NFC 訪問 | PN532 + NTAG424 DNA | badge_uid,已授予(布爾) |
{ "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 已讀。發出挑戰。
Ed25519 已驗證。
Identity Tag 是建構在 Identity IoT 之上的應用程式層。 每個 badge 讀取都會觸發後端的完整 Ed25519 challenge/response 週期。 reader 上沒有儲存秘密。 badge 上沒有明文標識。設計為多tenant。
# 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
| 模式 | 描述 | 使用案例 |
|---|---|---|
| STD | Badge 可在 tenant 授權機隊中的任何終端上運作。 | 辦公室通道、一般入口點。 |
| HS | Badge 以加密方式綁定到特定終端。 DEK 衍生包含終端公鑰的 hash。 Badge 對任何其他 reader 無效。 | 高安全性機房、資料中心機架、設備櫃。 |
| 端點 | 方法 | 角色 |
|---|---|---|
| identity_tag/it_request_challenge | POST | 發出隨機數以進行 badge 驗證 |
| identity_tag/it_verify_badge | POST | 驗證Ed25519簽名,回傳GRANTED/DENIED |
| identity_tag/it_node_checkin | POST | Node 心跳與 JWT 刷新 |
| identity_tag/it_register_badge | POST (manager) | 寫入 badge 公鑰與權利 |
| identity_tag/it_list_nodes | GET (manager) | tenant 的 Node 車隊狀態 |
配置和管理應用程式在 Android 上運行。它使用裝置的 NFC 寫入 badge 有效負載 並透過經過驗證的 Identity Layer 通道連接到後端。
// 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);
設備綁定的身份。
四通電話。
本地包。沒有外部身分服務。私鑰永遠不會離開裝置。
安全儲存透過 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
| 平台 | 地位 | 安全儲存 |
|---|---|---|
| 安卓 | 生產,Google Play 已清除 | Android 金鑰庫 / TEE |
| 視窗 | 生產,Microsoft Store 已清除 | Windows 憑證管理員 |
| Linux | 生產 | 庫秘密 |
| iOS/macOS | 在路線圖上 | Secure Enclave |
5 KB。
你的堆棧,不變。
PHP bridge 是位於現有端點前方的單一需求。 您的路線、您的資料庫、您的業務邏輯。沒動過.. 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 終點
註冊授權並開啟 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 分鐘) |
| 橋樑尺寸 | 5KB | 單一 PHP 文件,放入任何 LAMP 堆疊中 |
| 全端大小 | 225 KB | 身分 STD + HS + 金鑰 + 安全通道 + IoT + 標籤 + 標籤 |
| 部署 | 容器/本地/air-gapped | 沒有強制的雲端連接 |