工业互联网平台安全防护体系:从边缘层到云端的纵深防御实战
某汽车零部件厂在一次内部排查里发现,焊接车间的边缘网关把采集数据原样发到了平台侧的消息队列,队列里堆着三个月的明文工艺曲线——工业互联网平台安全防护的难度就在这件事里:它不是在某个位置加一道锁,而是从边缘层到云端这条链上,每一段的凭据、加密、密钥、授权都得各自立住,并且不能互相串用。同一时间,厂商推送过来的一版网关固件,落地时只校验了文件名和大小,两件事凑在一起才让问题暴露出来。
坐标先立:工业互联网平台的安全要求可以按"接入—传输—存算—应用"四个平面来拆。接入平面对应设备与平台的双向身份认定,传输平面对应数据在车间网络与骨干链路上的形态,存算平面对应采集库、工艺库、模型库的存储加密与密钥归属,应用平面对应账号访问、指令下发与固件升级的授权与签发。国内做这类平台的合规参照通常包括网络安全等级保护相关标准、密码应用基本要求,以及工业控制系统安全与工业互联网企业网络安全分类分级的相关指南。本文切入的是这四个平面怎么在同一套体系里咬合,以及为什么凭据跨平面串用是这条链上代价最高的一类错误。
01 | 工业互联网平台安全防护的这件事,难在哪儿
工业互联网平台的复杂度不在于算法有多难,而在于设备种类多、网络层次多、数据用途多。具体难在这几处:
首要难点在设备分散且不可频繁维护。 一条产线上的边缘网关、PLC、仪表可能有上百台,分布在不同车间,很多设备部署之后就长期无人值守。给它们换密钥、升级固件、回收权限,都要在不中断生产的前提下完成。这意味着任何依赖"现场人工操作"的保护动作,在这种规模下都跑不动。落到这条线上,PLC工控安全认证加固要解决的头一件事就是让每台设备拥有独立凭据,而不是给一批设备配同一套口令。
其次,上行数据链和下行指令链的保护目标完全不同。 上行是采集数据从设备流向平台,主要担心泄露和被篡改;下行是参数、指令、固件从平台流向设备,主要担心伪造和越权。两条链方向相反、威胁模型不同,用同一套凭据、同一套密钥去覆盖,等于把两个不同性质的风险绑成了一捆。
再有一处难点在凭据种类多,容易串用。 一个平台里至少同时存在四类凭据:设备密钥、操作员账号令牌、厂商固件签名密钥、服务间调用凭据。很多团队为了省事,让多个环节共用一把密钥或一个服务账号。这样做在系统上线时看不出问题,但一旦某一处泄露,攻击者就能沿着共用关系横向挪动到别的平面。MES系统身份认证加固在这件事上的定位是给应用平面的账号凭据划出边界,而不是替设备平面生成凭据。
还有一处难点在固件升级是风险最高的下行通道。 固件升级包本质上是"让设备执行新代码"的授权动作。如果升级包只校验完整性而不校验签发方,任何拿到内网写入权限的人都能推送一版固件;如果校验了签发方但没有版本约束,攻击者可以拿一个旧版本固件把设备回滚到存在已知缺陷的状态。
最后一处难点在测评会追到凭据的签发与存放。 等保测评和密码应用测评不会只问"有没有加密",而是会追到:设备身份怎么认定、密钥在哪里生成、私钥是否离开过安全边界、固件签名由谁签发、签发记录保存在哪里。任何一个环节答不上来,这一项就是不符合。
把这五处难点串起来看,工业互联网平台安全防护的核心矛盾是:四个平面各自都有成熟技术,难点在于让它们共享同一套身份口径,同时严格禁止凭据跨平面串用。
02 | 机制拆解:工业互联网平台安全防护的四个平面
先把四个平面各自的职责划清楚,再看它们怎么咬合。
| 接入平面 | 设备是不是它声称的那台 | 设备密钥双向认证、一机一密 | 伪造网关持续上报数据 | 未认证设备接入拦截率 |
| 传输平面 | 数据在链路上不泄露、不被改 | 国密分组算法加密、设备侧签名 | 消息队列里出现明文工艺数据 | 明文报文占比 |
| 存算平面 | 落库数据被拖走后仍不可用 | 采集库与工艺库分钥、域密钥派生 | 一个库失守牵连全部数据 | 域密钥隔离覆盖度 |
| 应用平面 | 谁有权下发指令与固件 | 固件厂商签名、账号多因素、签发权分离 | 非授权固件被设备接受 | 非授权签发拦截率 |
这四个平面的边界要讲清楚:接入平面只解决"你是谁",不解决"数据看不见";传输平面只解决"路上安全",不解决"落库安全";存算平面保护的是静态数据,替代不了接入身份;应用平面管的是授权与签发,不能拿设备密钥去顶替。很多团队的误区是把四件事压成一套账号口令,结果一个口令泄露,四个平面同时失守。以固件为例,工控HSM固件签名验签把签发方认定从配置约定变成密码学上可验证的动作,这一步是应用平面能立住的关键。
下面这张图说明四个平面在一次"采集上行 + 固件下行"里的位置关系:
上行(采集数据) 下行(参数 / 固件)
——————> <——————
[PLC / 仪表] [厂商签名密钥]
| 明文只到网关 | 签固件包
v v
[边缘网关] –SM4加密–> [消息队列] [平台] –验签–> [边缘网关]
| 设备私钥签名 | 验签发方 + 版本约束
v v
[平台验签/解密] –> [采集库] [设备二次验签] –> 执行
|
域密钥(采集) != 域密钥(工艺) 操作员账号令牌只作用于应用平面
设备私钥不出设备安全区 不能用于签采集报文
工业互联网平台安全防护里设备接入平面守的是什么
设备接入平面真正要守的是"设备身份的不可伪造"。这里最容易做错的地方是:把一台设备的密钥复制到一批设备上。批量烧录时为了效率,把同一份密钥镜像写进同型号的所有网关,结果是这些设备在平台侧看起来是同一台。正确做法是每台设备各自持有独立的密钥对,私钥在设备安全区内生成或写入后不再读出,平台侧只登记公钥;设备上报时带设备标识,平台按标识取对应公钥验签。这样改造完成之后,PLC工控安全认证加固才真正落到了设备这一层,而不是停留在台账上。
工业互联网平台安全防护里固件签发权应该归谁
固件签发权必须归厂商,不能归平台、更不能归设备。这是一个"签发权单向"的设计:厂商用厂商私钥签名,平台验签后分发,设备收到后再做一次验签。平台和设备的验签动作是平行关系,不是接力关系——设备不能因为"平台已经验过了"就跳过自己的验签。这条规则在测评里对应的正是完整性与不可否认性两项,也是工控HSM固件签名验签这套动作存在的理由:签名私钥驻留在密码模块内,应用侧只提交摘要、取回签名值,私钥不进入任何可以被导出的位置。
03 | 先跑通:工业互联网平台安全防护的四个环节
下面这段演示把四个平面跑成一条完整链路:先用国密分组算法把采集报文加密上行,再对报文摘要做设备签名并验证篡改、冒名、跨平面串用三种情况,然后验证固件包必须由厂商密钥签发,最后演示采集库与工艺库按数据域分钥、以及主密钥轮换后域密钥的变化。
# -*- coding: utf-8 -*-
"""
账号3 Day1 #2 演示:工业互联网平台安全防护体系
覆盖四件事:
1) 接入平面 —— 边缘网关以设备私钥对采集报文签名,平台按设备公钥验签
2) 传输平面 —— 采集数据以国密分组算法加密上行,边缘侧不留明文
3) 存算平面 —— 按数据域(采集库 / 工艺参数库)分钥,域密钥由主密钥派生
4) 应用平面 —— 固件升级包由厂商私钥签名,平台与设备两侧分别验签
本篇的核心验证点:同一个凭据不能跨平面通兑——
设备密钥签不出固件包,操作员账号密钥签不了采集报文。
演示用固定私钥,且固定 K(同一私钥 + 同一 K 会泄露私钥,仅演示用)。
断言统一 print(f"[{t}] = {'True' if ok else 'False'}"),全部为 True。
"""
from gmssl import sm2, sm4, sm3, func
# —- 固定私钥(已过 xxcsdn_keycheck.py 三关预检) —-
PRIV_DEV = "6a3a91c46a3a91c46a3a91c46a3a91c46a3a91c46a3a91c46a3a91c46a3a91c4" # 边缘网关设备
PRIV_OP = "5b8e27d05b8e27d05b8e27d05b8e27d05b8e27d05b8e27d05b8e27d05b8e27d0" # 应用平面操作员令牌
PRIV_VENDOR = "7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab" # 固件厂商签名
PRIV_FAKE = "4d5f0c724d5f0c724d5f0c724d5f0c724d5f0c724d5f0c724d5f0c724d5f0c72" # 冒名设备
FIXED_K = "0101010101010101010101010101010101010101010101010101010101010101"
def pub_of(priv: str) -> str:
"""P = d*G。gmssl 不会从私钥派生公钥,必须显式算出再传给 CryptSM2。"""
return sm2.CryptSM2(private_key=priv, public_key="")._kg(
int(priv, 16), sm2.default_ecc_table["g"])
PUB_DEV = pub_of(PRIV_DEV)
PUB_OP = pub_of(PRIV_OP)
PUB_VENDOR = pub_of(PRIV_VENDOR)
sm2_dev = sm2.CryptSM2(public_key=PUB_DEV, private_key=PRIV_DEV)
sm2_op = sm2.CryptSM2(public_key=PUB_OP, private_key=PRIV_OP)
sm2_vendor = sm2.CryptSM2(public_key=PUB_VENDOR, private_key=PRIV_VENDOR)
sm2_fake = sm2.CryptSM2(public_key=pub_of(PRIV_FAKE), private_key=PRIV_FAKE)
# 平台侧只持有设备公钥,不持有设备私钥
sm2_plat_verifier = sm2.CryptSM2(public_key=PUB_DEV, private_key=PRIV_DEV)
def sm3_hex(data: bytes) -> str:
return sm3.sm3_hash(func.bytes_to_list(data))
# —- 手写 SM4-CBC:gmssl 的 crypt_cbc 有缺陷,one_round 是 16 进 16 出的单块运算 —-
def sm4_cbc(key: bytes, iv: bytes, data: bytes, enc: bool) -> bytes:
assert len(key) == 16, "SM4 KEY 必须 16 字节"
assert len(iv) == 16, "IV 必须 16 字节"
c = sm4.CryptSM4()
c.set_key(key, sm4.SM4_ENCRYPT if enc else sm4.SM4_DECRYPT)
out, prev = b"", iv
for i in range(0, len(data), 16):
blk = data[i:i + 16]
if enc:
x = bytes(a ^ b for a, b in zip(blk, prev))
e = bytes(c.one_round(c.sk, list(x)))
out += e
prev = e
else:
d = bytes(c.one_round(c.sk, list(blk)))
out += bytes(a ^ b for a, b in zip(d, prev))
prev = blk
return out
def pkcs7_pad(data: bytes, block: int = 16) -> bytes:
pad = block – (len(data) % block)
return data + bytes([pad]) * pad
def pkcs7_unpad(data: bytes) -> bytes:
pad = data[-1]
if not (1 <= pad <= 16):
return data
return data[:-pad]
def decrypt_or_none(key: bytes, iv: bytes, ct: bytes):
try:
return pkcs7_unpad(sm4_cbc(key, iv, ct, False))
except Exception: # noqa: BLE001
return None
# ===== 传输平面:采集数据加密上行,边缘侧不留明文 =====
KEY = b"16BYTEKEYFOREDGE"
IV = b"16BYTEIVFOREDGEW"
telemetry = ("TELEMETRY:dev=GW-A07&line=WELD-02&temp=812.4&"
"vib=0.037&ts=20260923T103500").encode("utf-8")
ct = sm4_cbc(KEY, IV, pkcs7_pad(telemetry), True)
ok_enc = decrypt_or_none(KEY, IV, ct) == telemetry
ok_ct_diff = ct != telemetry
# ===== 接入平面:设备签名,平台验签 =====
h_tele = sm3_hex(telemetry)
sig_dev = sm2_dev.sign(h_tele.encode("utf-8"), FIXED_K)
ok_dev_sign = sm2_plat_verifier.verify(sig_dev, h_tele.encode("utf-8"))
h_tele_tam = sm3_hex((telemetry + b"|tampered"))
ok_tamper = not sm2_plat_verifier.verify(sig_dev, h_tele_tam.encode("utf-8"))
sig_fake = sm2_fake.sign(h_tele.encode("utf-8"), FIXED_K)
ok_imposter = not sm2_plat_verifier.verify(sig_fake, h_tele.encode("utf-8"))
ok_repro = sm2_dev.sign(h_tele.encode("utf-8"), FIXED_K) == sig_dev
# ===== 凭据不跨平面通兑:应用平面操作员令牌签不了采集报文 =====
sig_op = sm2_op.sign(h_tele.encode("utf-8"), FIXED_K)
ok_no_cross = not sm2_plat_verifier.verify(sig_op, h_tele.encode("utf-8"))
# ===== 应用平面:固件升级包由厂商签名 =====
fw = ("FIRMWARE:model=GW-A07&ver=3.4.2&sha256="
"9f2c1b7ad4e65380a1c0d7be5f39124ac8d60e7b3f95a1c2d4e6f8091a3b5c7d"
).encode("utf-8")
h_fw = sm3_hex(fw)
sig_fw = sm2_vendor.sign(h_fw.encode("utf-8"), FIXED_K)
ok_fw_sign = sm2_vendor.verify(sig_fw, h_fw.encode("utf-8"))
h_fw_tam = sm3_hex(fw + b"|patched")
ok_fw_tamper = not sm2_vendor.verify(sig_fw, h_fw_tam.encode("utf-8"))
# 设备密钥不能代替厂商签固件包(签发权不越界)
sig_fw_by_dev = sm2_dev.sign(h_fw.encode("utf-8"), FIXED_K)
ok_fw_no_dev = not sm2_vendor.verify(sig_fw_by_dev, h_fw.encode("utf-8"))
# ===== 存算平面:按数据域分钥,域密钥由主密钥派生 =====
MASTER = b"MASTER-KEY-FOR-PLANT-0421"
dom_collect = sm3_hex(MASTER + b"|domain=telemetry|workshop=A")
dom_process = sm3_hex(MASTER + b"|domain=recipe|workshop=A")
dom_collect_b = sm3_hex(MASTER + b"|domain=telemetry|workshop=B")
ok_domain_diff = dom_collect != dom_process
ok_workshop_diff = dom_collect != dom_collect_b
ok_derive_len = len(dom_collect) == 64
ok_not_master = dom_collect != MASTER.hex()
ok_rotate = dom_collect != sm3_hex(b"NEW-MASTER-KEY-FOR-PLANT" + b"|domain=telemetry|workshop=A")
asserts = [
("SM4采集数据加密可解密还原", ok_enc),
("SM4密文与明文不同", ok_ct_diff),
("设备签名平台验签通过", ok_dev_sign),
("采集报文篡改后签名被拒绝", ok_tamper),
("冒名设备签名被拒绝", ok_imposter),
("固定K签名可复现", ok_repro),
("操作员令牌签的采集报文被拒绝", ok_no_cross),
("固件包厂商签名验签通过", ok_fw_sign),
("固件包内容被换后签名被拒绝", ok_fw_tamper),
("设备密钥签的固件包被拒绝", ok_fw_no_dev),
("采集库与工艺参数库域密钥不同", ok_domain_diff),
("不同车间域密钥不同", ok_workshop_diff),
("域密钥为64位十六进制", ok_derive_len),
("域密钥不等于主密钥", ok_not_master),
("主密钥轮换后域密钥变化", ok_rotate),
("SM2签名为hex字符串", isinstance(sig_dev, str)),
("SM4密文为bytes", isinstance(ct, bytes)),
]
print("=" * 60)
for t, ok in asserts:
print(f"[{t}] = {'True' if ok else 'False'}")
============================================================
[SM4采集数据加密可解密还原] = True
[SM4密文与明文不同] = True
[设备签名平台验签通过] = True
[采集报文篡改后签名被拒绝] = True
[冒名设备签名被拒绝] = True
[固定K签名可复现] = True
[操作员令牌签的采集报文被拒绝] = True
[固件包厂商签名验签通过] = True
[固件包内容被换后签名被拒绝] = True
[设备密钥签的固件包被拒绝] = True
[采集库与工艺参数库域密钥不同] = True
[不同车间域密钥不同] = True
[域密钥为64位十六进制] = True
[域密钥不等于主密钥] = True
[主密钥轮换后域密钥变化] = True
[SM2签名为hex字符串] = True
[SM4密文为bytes] = True
跑通之后,这四个环节要逐个对上:
环节一:加密的对象要先定级再动手。 演示里对整条采集报文做加密,实际落地时要先分清哪些字段必须密文落库、哪些可以明文但脱敏展示。工艺曲线、配方参数属于高敏感,设备编号、采集时间戳属于业务敏感。定级错了,后面所有动作都会错位。
环节二:验签要在两侧分别做。 演示里平台侧对设备签名做了验签。真实系统里固件这条线还要在设备侧再做一次:平台验签管的是"分发前拦住",设备验签管的是"执行前拦住"。两次验签用的是同一把厂商公钥,但触发点不同,缺任何一次都会留下一段可被绕过的空档。
环节三:签发权要按平面隔离。 演示里设备密钥签出的固件包被固件验签方拒绝,操作员账号令牌签出的采集报文被接入平面拒绝。这两条断言看着简单,实际是整套体系里最容易被牺牲的一条——为了联调方便,很多项目会把应用平面的凭据临时借给设备平面用,联调完了也忘了收回来。
环节四:域密钥要按数据用途分。 演示里采集库和工艺参数库用的是两套不同的域密钥,不同车间又再分一层。这样做的好处是:某一类数据被拖走时,影响面被限制在单个域内,不会因为一把密钥通吃而牵连全部历史数据。域密钥由主密钥按"域 + 车间"派生,派生因子本身不是秘密,但必须完整记录,否则轮换时无法重建历史密钥。应用平面那侧同理,MES系统身份认证加固决定了谁能触发参数下发,也决定了这条触发动作能不能被事后追溯。
这四个环节里,最容易出问题的是环节三和环节四——它们都属于"联调阶段看不出问题、出事时才发现凭据早就串了"的类型。
04 | 落地动作:工业互联网平台安全防护分四条线怎么做
工业互联网平台安全防护要落到可执行,建议按四条线推进,每条线都有明确的交付物。
线一:设备身份基线。 先产出一张设备台账,标注每台设备的标识、密钥类型、注入方式、公钥登记状态、责任人。再改造接入流程,让未登记公钥的设备在接入阶段就被拒绝。这条线的交付物是设备身份与公钥登记表,也是后续所有动作的地基。线一做完,PLC工控安全认证加固才算真正落到了设备侧,而不是停留在制度文本上。
线二:上行链路加密。 梳理所有从设备到平台的数据通道,明确每段通道的加密位置与加密粒度。原则是明文只到网关:数据在网关完成加密之后才进入车间网络,消息队列、中间件、备份文件里都不应该出现明文工艺数据。这条线的交付物是通道加密位置图与字段定级表。
线三:存算域分钥。 建立主密钥与域密钥两层结构,按数据用途划分域,每个域一把域密钥,由主密钥派生并带版本号。明确每层的生成位置、分发方式、轮换周期、归档要求。这条线的交付物是域密钥划分与轮换规程。
线四:下行签发治理。 梳理所有会产生下行动作的场景——参数下发、指令下发、固件升级、远程调试,为每个场景指定签发方、验签点、版本约束。固件升级必须做到厂商签名、平台验签、设备再验签,并加上版本单调约束。这条线的交付物是下行动作签发权矩阵。MES系统身份认证加固与固件签发治理在这条线上并行推进,前者管人、后者管包。
四条线推进有先后:线一是线二、线四的前提,因为不知道设备是谁就无法确定谁有权签;线三的域密钥划分又要建立在数据定级完成的基础上。
一个可参照的整改样本
背景:某制造企业的工业互联网平台上,同型号的两百多台边缘网关共用同一份密钥镜像,固件升级包落地时只校验文件大小。
动作:先在产线注入环节改为每台网关生成独立密钥对,私钥写入设备安全区,平台侧只登记公钥;再把固件升级流程改为厂商签名、平台验签、设备二次验签三段,并加入版本下限约束。
结果:共用密钥的问题在两轮产线改造后消除,平台侧开始能按设备标识区分上报来源;一次内部演练中构造的旧版本固件包被设备侧拒绝执行,拦截位置在设备侧而非平台侧——这正好验证了"两次验签不能合为一次"的设计是对的。
05 | 避坑清单:8 条最容易踩的坑
| 1 | 同型号设备共用一份密钥 | 设备身份无法区分,一台泄露全部受影响 | 抽查平台侧公钥登记数是否等于设备数 |
| 2 | 设备私钥可被导出或随镜像复制 | 私钥泄露后无法界定影响范围 | 检查私钥是否只在设备安全区内生成与使用 |
| 3 | 采集报文只加密不签名 | 内部篡改无感知 | 构造一条改数值的报文,看平台能否发现 |
| 4 | 固件只校验完整性不校验签发方 | 内网写入权限即可推送固件 | 用非厂商密钥签一包固件,看是否被拒 |
| 5 | 设备因为平台已验签而跳过二次验签 | 分发环节被绕过即失守 | 在设备侧断网重放一包旧固件看是否被拒 |
| 6 | 一把密钥通吃采集库与工艺库 | 单库失守牵连全部数据 | 检查域密钥划分表是否覆盖全部库 |
| 7 | 派生因子未记录 | 历史密钥无法重建 | 抽查历史域能否重建当时的域密钥 |
| 8 | 应用平面凭据借给设备平面联调后未收回 | 凭据跨平面串用长期留存 | 定期比对签发权矩阵与实际调用关系 |
挑第 4 条展开说。固件只校验完整性这件事,在很多项目里的理由是"内网已经很安全了"。但内网写入权限的获取成本远低于想象:一个被入侵的运维终端、一台接入了车间网的笔记本、一个配置错误的共享目录,都可能让人拿到升级包的投放位置。完整性校验能拦住"传输出错",拦不住"内容被换"——因为攻击者换完内容可以顺手重算校验值。真正能拦住的是签发方认定:验签用的是厂商公钥,攻击者拿不到厂商私钥,就造不出能通过验签的升级包。这一步的代价只是多一次验签调用,收益是把升级通道从"内网可信"改成"签发方可信"。
06 | 合规视角:工业互联网平台安全防护要对上哪些要求
工业互联网平台在国内落地时,通常会同时面对几条线的要求:
等级保护相关要求。 关注身份鉴别、访问控制、数据完整性与保密性、安全审计。平台侧的三级系统是常见门槛,对应的测评项会追到设备身份认定方式、加密算法选择、密钥管理、日志完整性。其中系统侧的身份鉴别与访问控制,对应的就是 MES系统身份认证加固这条线。
密码应用基本要求。 关注身份鉴别、访问控制、数据完整性、数据保密性、不可否认性四个层面。设备签名对应完整性与不可否认性,采集数据加密对应保密性,账号多因素对应身份鉴别,这三项在测评里都会被单独检查。固件签发这一项,对应的正是工控HSM固件签名验签。
工业控制系统安全相关标准。 工业自动化与控制系统的安全标准体系按区域与功能划分安全等级,强调分区分域、区域边界防护与通信完整性。做平台架构时把"车间网络—骨干网—平台区"的边界画清楚,本身就是对这套标准的对齐。
工业互联网企业网络安全分类分级相关指南。 企业按所属行业、规模、应用程度等维度被划分等级,不同等级对应不同的防护要求与测评频次。定级结果直接影响要做多少事,所以定级这一步要在方案设计之前完成,而不是做完改造再去倒推定级。
数据安全相关法规。 工艺参数、配方数据在很多企业属于重要数据,需要纳入分类分级管理,明确存储加密、访问审计、对外提供的审批路径。跨境场景还要单独评估。
这里的实用建议是:不要把这些要求当成五份独立清单分别应对,而是建一张映射表,把每条要求映射到"设备身份、链路加密、域分钥、签发治理"这四个动作上。这样检查一次,五份清单同时受益。
07 | 落地答案:怎么承接这四个平面
工业互联网平台安全防护落到产品能力上,通常这样组合四个平面:
设备接入这一段,需要的能力是"设备身份可认定、凭据不可搬运"。统一身份认证能力承担设备标识与凭据的登记、认证与吊销;设备侧的私钥存放在安全区或密码模块内,签名动作在设备本地完成,平台侧只持有公钥。这样即使平台被入侵,攻击者也拿不到设备私钥,造不出能通过验签的上报数据。PLC工控安全认证加固在这一段属于前提动作:先有独立凭据,才有后续的加密与签发。
链路与落盘这一段,需要的能力是"写入路径上做加密,同时不影响业务查询"。数据库透明加密解决的是落盘这一层:敏感列在写入时自动加密、读取时自动解密,业务 SQL 不用改,日志、备份、导出文件里都是密文。对需要保留等值查询能力的字段,可以配合确定性加密与盲索引,让密文列仍支持条件查询。
密钥这一段,需要的能力是"分域、派生、轮换、归档都能被管理起来"。密钥管理平台承担主密钥的生成与保护、按"域 + 车间"派生域密钥、版本化管理与轮换编排、旧版本归档与历史验签支持。这样"一把密钥只管一个域、主密钥按年轮换、历史密钥可回溯"这套时间线才真正跑得起来。
签发这一段,需要的能力是"签名动作在密码模块内完成、签名私钥不离开模块边界"。固件签发由厂商侧的签名服务完成,平台与设备各自用厂商公钥验签;操作员的关键下行动作叠加多因素认证,账号令牌的签发范围被限制在应用平面之内。这几个动作合起来,正是工控HSM固件签名验签与 MES系统身份认证加固在平台上的落点。
这四段能力的组合,正好覆盖设备接入、链路加密、域分钥、签发治理四个平面,也直接对应了 06 节里那几份清单的检查项。
08 | 验收清单与下一步
上线前建议逐项过一遍这张表:
| 1 | 设备公钥登记覆盖度 | 登记数等于在线设备数,无共用公钥 |
| 2 | 设备私钥可导出性 | 私钥不可从设备安全区读出 |
| 3 | 采集报文签名覆盖 | 签名字段集与关键字段集一致 |
| 4 | 篡改拦截验证 | 构造篡改报文能被平台验签拦截 |
| 5 | 冒名设备拦截验证 | 换私钥构造的签名被平台拒绝 |
| 6 | 跨平面凭据拦截验证 | 应用平面凭据签的报文被接入平面拒绝 |
| 7 | 队列明文检查 | 消息队列、中间件、备份中无明文工艺数据 |
| 8 | 固件签发方认定 | 非厂商密钥签的固件包被平台与设备拒绝 |
| 9 | 固件版本约束 | 低于当前版本的固件包被设备拒绝执行 |
| 10 | 设备侧二次验签 | 设备不因平台已验签而跳过验签 |
| 11 | 域密钥划分 | 采集、工艺、模型三类库密钥相互独立 |
| 12 | 域密钥版本化 | 密文与签名均记录密钥版本号 |
| 13 | 历史验签能力 | 一年前的上报数据仍能验签通过 |
| 14 | 下发动作多因素覆盖 | 关键下行动作全部要求额外的独立因素 |
| 15 | 签发权矩阵更新 | 联调临时授权已收回,矩阵与实际一致 |
趋势上看,工业互联网平台安全防护的重心正在从"边界防护"往"凭据治理"迁移。过去只要车间网与办公网隔离了、平台入口有防火墙就算达标;现在的检查会追到单台设备的身份能不能认定、单个固件的签发方能不能追溯、单个域的密钥失守之后影响面有多大。这个迁移对架构的实质要求是:接入、传输、存算、应用四件事不能再各自为政,它们必须共享同一套设备身份口径、同一套密钥版本、同一套签发权矩阵。对制造企业来说,PLC工控安全认证加固与域密钥划分会先于其他动作被检查到,因为它们是这套口径的地基。
下一篇预告:我们接着拆房地产侧的同一件事:智慧社区门禁身份认证,看人脸识别门禁的多因素认证、访客临时凭证与通行记录防抵赖这三件事在社区场景里怎么落地,和工业场景的四个平面有哪些相同、又有哪些根本不同。
文章作者:安当加密-焱垚




