Appearance
FDP-Security 安全协议
FDP-Security是FDP协议族的可选安全扩展,提供传输层无关的端对端安全通信能力。
为什么需要安全协议?
常见误区
| 误区 | 问题 |
|---|---|
| "用了TLS就安全" | TLS只保护传输层,不支持蓝牙等非TCP传输 |
| "MQTT ACL够用" | ACL只控制主题访问,不验证消息真实性 |
| "加密了就不会被篡改" | 大错! 没有认证的加密可被精确修改 |
FDP-Security解决的问题
- 身份认证 - 如何确认消息真的来自声称的发送者?
- 权限验证 - 如何验证发送者有权执行该操作?
- 消息保护 - 如何防止窃听和篡改?
设计目标
- 传输层无关 - 支持MQTT、蓝牙GATT、WiFi Direct等
- 极小开销 - 通信阶段仅28字节/消息(适合BLE)
- 离线运行 - 完全支持无网络环境
- 前向安全 - 历史会话不因私钥泄露而暴露
架构概览
核心概念
身份与权限解耦
FDP-Security将身份认证和权限管理分离:
| 组件 | 职责 | 有效期 |
|---|---|---|
| Credential | 证明"你是谁" | 永久有效 |
| 权限表 | 决定"你能做什么" | 存储在设备端,可随时更新 |
优势:
- 撤销权限只需从设备权限表删除uid,无需更换Credential
- 支持完全离线运行(无需联网验证权限)
会话协商模式
借鉴HTTPS的思路:
- 握手阶段(可以大):交换身份凭证,协商会话密钥
- 通信阶段(必须小):使用会话密钥加密+认证
算法选择
| 算法 | 用途 | 选择原因 |
|---|---|---|
| Ed25519 | 数字签名 | 32字节公钥,高效安全 |
| X25519 | ECDH密钥交换 | 前向安全 |
| ChaCha20-Poly1305 | AEAD加密 | 适合无硬件加速的嵌入式设备 |
| HKDF-SHA256 | 密钥派生 | 从共享密钥派生会话密钥 |
| CBOR | 二进制序列化 | 最小化消息体积 |
性能对比
蓝牙场景
BLE默认MTU = 23字节
| 方案 | 消息大小 | BLE包数 |
|---|---|---|
| JSON + HMAC | ~190字节 | 10包 |
| JWT签名 | 542字节 | 28包 |
| FDP-Security | 28字节 | 2包 |
开销对比
| 方案 | 每消息开销 | 加密 | 认证 | 传输无关 | 离线 |
|---|---|---|---|---|---|
| JWT签名 | 542字节 | ❌ | ✅ | ✅ | ✅ |
| Ed25519签名 | 86字节 | ❌ | ✅ | ✅ | ✅ |
| mTLS | 0字节 | ✅ | ✅ | ❌ | ❌ |
| FDP-Security | 28字节 | ✅ | ✅ | ✅ | ✅ |
文档导航
| 文档 | 内容 |
|---|---|
| 威胁模型 | 安全挑战分析与设计思路 |
| 简单鉴权 | 基于secret的极简鉴权,适用于TLS环境 |
| HMAC签名鉴权 | 基于HMAC签名的鉴权方案,适用于任意传输 |
| 端对端安全协议 | 完整的端对端加密方案 |
实现库推荐
| 平台 | 推荐库 |
|---|---|
| Python | cryptography, cbor2 |
| C/嵌入式 | libsodium(强烈推荐), mbedtls |
| JavaScript | @noble/ed25519, @noble/hashes |
| Go | golang.org/x/crypto |
