业务背景
某水表制造企业年产智能水表60万台,销往全国30个城市的水务集团。每台水表出厂前需要烧录通信密钥——水务集团要求使用SM4算法加密水表与采集器之间的通信数据,密钥由水务集团统一分发管理。
当前生产线流程:水务集团将密钥文件(U盘)寄送到工厂 → 工程师在烧录工位上逐台复制密钥 → 每台水表烧录约40秒 → 完成后填写纸质记录表。60万台水表约需6700人天。
安全缺口分析
- 密钥分发链路不可控: U盘在快递过程中可能被复制或替换。某批次水表密钥曾在物流环节丢失,导致5000台已发货水表的密钥需要远程更换
- 产线操作无审计记录: 纸质记录表无法追溯"谁在什么时间烧录了哪台水表的什么密钥"
- 密钥从未轮换: 使用AKA协议的水表使用出厂时烧录的固定密钥,运行5年从未更换
安当方案设计
产线密钥注入架构
水务集团KSP 水表产线 城市水表
┌─────────────┐ ┌──────────────────┐ ┌──────────────┐
│ HSM根密钥 │ │ CAS-KMS批量API │ │ 水表终端 │
│ 派生表具密钥 │────▶│ MES系统对接 │────▶│ 密钥写入安全区 │
│ 密钥不离开 │ │ HS内部派生 │ │ SM4加密通信 │
│ 硬件 │ │ 每台独立派生因子 │ │ 90天自动轮换 │
└─────────────┘ └──────────────────┘ └──────────────┘
│
▼
┌──────────────┐
│ CAS审计日志 │
│ 每台水表记录 │
│ 谁+时间+密钥ID│
└──────────────┘
密钥派生机制
每台水表的密钥通过HKDF-SM3派生函数生成:
派生因子 = 水表ID + 批次号 + 生产日期
↓
HKDF-SM3(根密钥, 派生因子, 输出长度=32字节)
↓
每台水表独立密钥SK_i(完全不同)
水表1因子:METER-00001:BATCH-2026Q3:20260711 → SK_1
水表2因子:METER-00002:BATCH-2026Q3:20260711 → SK_2(完全不同)
实施路径
1. CAS-KMS批量密钥派生API
import requests, json
class WaterMeterKeyInjector:
"""水表产线密钥批量注入"""
def __init__(self, cas_url, project_token):
self.cas = cas_url
self.token = project_token
def batch_derive(self, meters, batch_id):
"""
批量派生水表密钥(HSM内部完成)
meters: [{"meter_id": "MTR-001", "city": "SHANGHAI"}, ...]
"""
payload = {
"batch_id": batch_id,
"meter_type": "WATER_NB_IOT",
"derivation_algorithm": "HKDF_SM3",
"key_algorithm": "SM4_256",
"master_key_ref": "HSM-WATER-MASTER",
"meters": meters
}
resp = requests.post(
f"{self.cas}/keys/batch-derive",
headers={"Authorization": f"Bearer {self.token}"},
json=payload,
timeout=120
)
if resp.status_code == 200:
result = resp.json()
return {
"batch": batch_id,
"count": len(meters),
"hsm_ms": result.get("hsm_duration_ms", 0),
"keys": result.get("derived_keys", [])
}
return {"error": resp.text}
# 产线应用:单批2000台水表
injector = WaterMeterKeyInjector(
"https://cas.andang.cn",
"water_prod_token"
)
meters = [{"meter_id": f"MTR-SH-{i:06d}", "city": "SHANGHAI"}
for i in range(2000)]
result = injector.batch_derive(meters, f"SH-BATCH-{batch_num}")
print(f"完成{result['count']}台,HSM耗时{result['hsm_ms']}ms")
2. 密钥烧录状态验证
-- 查询批次烧录状态
SELECT batch_id, COUNT(*) AS total,
SUM(CASE WHEN status='success' THEN 1 ELSE 0 END) AS success,
ROUND(AVG(hsm_duration_ms), 2) AS avg_hsm_ms
FROM cas_audit.key_injection_log
WHERE batch_id = 'SH-BATCH-20260711'
GROUP BY batch_id;
-- SH-BATCH-20260711 | 2000 | 2000 | 1.24
验证方法
# 验证单台水表密钥是否已正确派生
curl -X POST https://cas.andang.cn/api/v1/keys/verify \
-H "Authorization: Bearer <token>" \
-d '{"key_ref": "MTR-SH-000001_key", "verify_method": "challenge"}'
方案价值
- 产线效率从40秒/台降到毫秒级: CAS批量API单次2000+水表,HSM内部完成密钥派生
- 密钥零泄露: 密钥在HSM内生成,产线系统不接触明文
- 每台水表独立审计: CAS记录每台水表的密钥派生时间、操作人、批次号
适用场景: 智能水表产线、智能燃气表产线、热量表产线、物联网终端设备密钥注入
联系电话: 158-3060-0995 | 邮箱: marketing@andang.cn | 官网: https://www.andang.cn/