很少有電話。
任何平台。

Identity Layer 透過設計與最小表面整合。 微控制器上的 MicroPython,Android 和 Windows 上的 Flutter, 或將 PHP bridge 放入您現有的端點。 相同的協議。相同的加密保證。四通電話。

Raspberry Pi Pico 2W, PN532 NFC reader, SSD1306 OLED display, NTAG424 DNA card
Boot
Registering
Node exists
Verified
Challenge
Active
四次操作呼叫。 WiFi、OLED 和設定載入是設備基礎設施, 不是 Identity Layer。身份原語是 IdentityIoT, 透過安裝 mip
MicroPython
# 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
資料中心和實體存取垂直領域的 ESP32 和 RP2040 參考部署正在進行中。 所有支援的硬體上的協定和 SDK 都是相同的。

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 DNAbadge_uid,已授予(布爾)
JSON(已解密)
{
  "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。

Badge 到 GRANTED 分四步驟。 reader (Pico 2W + PN532) 是經過驗證的 Identity IoT node。 badge 攜帶 AES-CBC 加密的私鑰片段和分割的 DEK。 後端發出質詢,接收 Ed25519 簽名,驗證它,然後傳回 GRANTED 或 DENIED。 沒有秘密以明文形式通過線路。不存在憑證資料庫。
流程: badge 讀取存取決策
# 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 無效。 高安全性機房、資料中心機架、設備櫃。
每個 tenant 都有一個獨立的命名空間:自己的 node 佇列、badge 註冊表、群組樹和權利表。 註冊到 Tenant A 的 badge 無法被屬於 Tenant B 的 node 驗證。 Tenant 隔離是在資料庫查詢層級強制執行的,而不是單獨透過應用程式邏輯執行。
端點方法角色
identity_tag/it_request_challengePOST發出隨機數以進行 badge 驗證
identity_tag/it_verify_badgePOST驗證Ed25519簽名,回傳GRANTED/DENIED
identity_tag/it_node_checkinPOSTNode 心跳與 JWT 刷新
identity_tag/it_register_badgePOST (manager)寫入 badge 公鑰與權利
identity_tag/it_list_nodesGET (manager)tenant 的 Node 車隊狀態

配置和管理應用程式在 Android 上運行。它使用裝置的 NFC 寫入 badge 有效負載 並透過經過驗證的 Identity Layer 通道連接到後端。

Dart / Flutter: badge 寫入
// 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

identity_package identity_std identity_hs items_crypto items_search items_document_body
所有包都是本地的。 pub.dev 不依賴身分層。 SDK 作為許可包的一部分進行分發。
Dart / Flutter
// 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'});
YAML
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
PHP
// 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 小時出口窗口。 日誌收集後銷毀。請求機關承擔法律責任。
PHP: mj_mandate_log
// 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沒有強制的雲端連接