密钥保密要求
接入时重点保护两个长期值:AccessKeySecret 和 device_secret_key。
两者都不要出现在客户端、日志、截图、工单或聊天记录中。AccessKeySecret 只放在可信业务服务端;device_secret_key 用于证明具体设备身份,只放在受控设备环境和确有需要的服务端流程中。
放在哪里
| 密钥 | 是什么 | 可以出现在哪里 | 不应出现在哪里 |
|---|---|---|---|
AccessKeySecret | 应用级长期密钥,用于服务端 TGV1 签名 | 业务服务端的密钥管理系统或受控运行环境 | 客户端、设备固件、前端脚本、示例仓库、日志、截图、工单 |
device_secret_key | 设备级长期密钥,与 device_id 一起证明设备身份 | 设备端受控存储;服务端确有需要的设备管理流程 | 客户端、普通配置模板、日志、群聊、邮件、截图、工单 |
不要这样做
- 把
AccessKeySecret写进 App、Electron 应用或示例代码。 - 把
device_secret_key当成普通配置打印到设备日志。 - 在群聊、邮件、工单或截图里发送完整 Token、Authorization 或签名计算过程。
- 把密钥写入本地配置文件后提交到仓库。
- 让设备直接签发 Token,或让客户端直接调用需要
AccessKeySecret签名的接口。
推荐做法
每一端只取得必要信息
- 业务服务端保管 AccessKey,并完成权限判断、签名和 Token 签发。
- 设备端使用设备身份和短期
device_access_token。 - 客户端使用绑定目标设备的短期
app_access_token。
Token 有效期按最小需要设置,服务端允许范围为 900~43200 秒。Token 到期时由受信任服务端重新签发。
日志里只放定位信息
通常只记录接口名、HTTP 状态、业务错误码、request_id、SDK 版本、脱敏设备 ID 和关键状态。不要记录:
AccessKeySecretdevice_secret_key- 完整 Token 或 Authorization
- 可复用的签名值
- 包含真实凭证的 Canonical Request
发给别人前先脱敏
只保留足以关联同一次请求的时间、request_id、错误码和字段长度。需要确认凭证是否匹配时,说明结果,不要复制原值。
如果已经泄露了怎么办
先停止继续传播,确认泄露范围,包括代码仓库、构建产物、日志、聊天、截图、工单和测试脚本。
AccessKeySecret 泄露
立即停用并轮换受影响的 AccessKey,更新业务服务端配置,检查泄露期间的 Token 签发、索引查询和删除审计记录,并清理所有已知副本。
device_secret_key 泄露
先确认受影响的 device_id 范围,再按项目交付流程制定设备密钥轮换方案。已经出厂的设备通常需要通过安全升级把新密钥写入设备,并与平台侧配置同步;两侧未同步完成时,设备鉴权可能失败。
Token 泄露
Token 是短期凭证,但在有效期内仍可能被滥用。停止继续传播,评估目标设备和授权范围,并在必要时按当前平台能力撤销或等待过期;同时修复产生泄露的日志或接口。