合规审计轻量级证书签发系统
合规审计轻量级证书签发系统要回答的,是一个很具体的问题:这批证书是谁签的、什么时候签的、有没有被吊销。某制造企业在一次密码应用评估中被追问设备证书台账,交付方拿得出证书文件,却拿不出"这批证书共 128 张、其中 2 张已吊销"的完整记录——台账是应用日志拼的,改一条看不出来。评审最后给的结论是签发与吊销未形成可核查的审计链。这类问题很常见:轻量 CA 部署快、签发快,审计却往往是后补的。
坐标先立:证书相关的密码要求可以按"密钥管理—证书生命周期—审计留痕"三层来拆,这是商用密码应用安全性评估里与证书系统直接相关的部分。轻量级证书签发系统的特殊之处在于,它常被部署在设备接入、内部服务互访这类量大、生命周期短的场景,签发频次高、吊销频繁,台账如果靠应用层日志拼接,就天然不可核查。本文切入的是最容易被做浅的一块:签发、吊销、台账这三件事怎么串成一条能举证的审计链。
01 | 合规审计轻量级证书签发系统这件事,难在哪儿
合规审计轻量级证书签发系统的复杂度,不在签发出一张证书,而在"签发、吊销、台账、链"四件事里,后两件通常没人管。某高校在物联网终端接入项目里,两万张设备证书的签发记录分散在三台服务器上,吊销靠手工改配置,评审问"这批证书现在还剩多少有效",花了两周才拼出答案。具体难在下面五处。
首要难点在身份认证轻量级证书签发系统的台账不全。签发有记录、吊销没记录,或者反过来;两张表对不上,就拼不出"现在有效多少"这个最基本的数。
其次,轻量级证书签发系统合规审计方案要能覆盖吊销环节。很多方案只写"签发留痕",把吊销当成运维动作;真正出问题时,追的恰恰是吊销——这张证书什么时候失效的、谁批的、生效了没有。
再有一处难点在台账可被修改。台账存在应用库里,改一条记录不留痕;评审要求"台账不可篡改",交付方只能答"数据库有权限控制",这不是密码学意义上的不可篡改。
还有一处难点在缺少批次概念。证书一张一张签,没有批次号、没有首尾序列号,问"这一批签了多少"要全表扫描;出了问题也定位不到是哪一批。
最后一处难点在审计快照的可迁移性。审计方要带走一段证据,交付方给的是一张截图或者一个可以被再次编辑的表格,出了系统就失去效力。
把这五处串起来看,核心矛盾是:评审要的是一条从签发到吊销可还原、可验证的链,而实际交付的是一堆分散的、可编辑的记录。
02 | 机制拆解:合规审计轻量级证书签发系统的四条线
先把四条线各自的职责划清楚,再看它们怎么共用一套签名与摘要机制。
| 线 | 要解决的核查点 | 典型手段 | 缺了会怎样 |
|---|---|---|---|
| 证书签发 | 谁签的、签给谁 | SM2 对证书字段整体签名 | 证书可被冒名签发 |
| 吊销管理 | 什么时候失效 | 吊销列表整体签名 + 命中判定 | 已吊销证书仍在用 |
| 台账留痕 | 一批签了多少 | SM3 摘要 + SM2 整体签名 | 数量可改、说不清 |
| 批次摘要链 | 记录有没有被动过 | 前一条摘要进下一条 | 改中间一条看不出来 |
四条线的边界要讲清楚:签发解决"这张证书可信",吊销解决"它什么时候不再可信",台账解决"这一批的整体情况",摘要链解决"这份台账本身有没有被动过"。前两条是业务动作,后两条是审计动作,二者不能互相替代——签发了不等于记录了,记录了不等于不可改。
合规审计轻量级证书签发系统的证书签发线
身份认证轻量级证书签发系统的证书签发线,落点是"证书字段整体签名"。把持有者名称、序列号、签发者、有效期起止拼成一个字符串,算 SM3 摘要后用 CA 私钥签名;验签方用 CA 公钥验。这里要强调的是,签名必须覆盖全部关键字段,只签序列号的话,把有效期改长照样能验过。
合规审计轻量级证书签发系统的吊销线
吊销线的落点是"吊销列表整体签名 + 命中判定"。吊销不是删掉证书,而是把序列号加进一份带签名的列表;校验方在验签通过后,还要查序列号是否在列表里。列表被删一条,签名就验不过——这是吊销可举证的关键。
合规审计轻量级证书签发系统的摘要链线
摘要链线的落点是"前一条摘要进下一条"。第 n 条记录的摘要由第 n-1 条的摘要与本条内容共同算出,改中间任何一条,链尾摘要就变。这一层把"不可篡改"从一句承诺变成了可演示的事实,而且不需要额外的基础设施。
下面这张图说明四条线在从签发到审计这一路上的位置关系:
[签发请求] --> [拼证书字段] --> [SM3摘要] --> [SM2签名:CA私钥] --> [证书文件] | v [吊销请求] --> [加入序列号] --> [吊销列表整体签名] --> [校验方:验签+查命中] | v [批次台账:issued/revoked/first/last] --> [SM3摘要+SM2整体签名] | v [逐条记录] --> [前一条摘要进下一条] --> [链尾摘要] --> [审计快照:仅审计方密钥可还原]03 | 先跑通:合规审计轻量级证书签发系统的四个环节
下面这段演示把签发、轮换、台账、吊销列表、摘要链、审计快照串在同一段代码里跑一遍,用的都是公开算法:SM2 签名、SM3 摘要、SM4 分组加密。代码只依赖gmssl,可以直接复现。
# -*- coding: utf-8 -*- """ W39 Day1 #2 · 合规审计轻量级证书签发系统 演示四件事:轻量 CA 签发设备证书 / 签发台账整体签名 / 吊销列表签名 / 批次摘要链 """ from gmssl import sm2, sm4, sm3, func # ---- 固定私钥(已过 xxcsdn_keycheck.py 三关) ---- PRIV_CA = "6a3a91c46a3a91c46a3a91c46a3a91c46a3a91c46a3a91c46a3a91c46a3a91c4" PRIV_CA_NEW = "4d5f0c724d5f0c724d5f0c724d5f0c724d5f0c724d5f0c724d5f0c724d5f0c72" # 轮换后的 CA PRIV_ROGUE = "5b8e27d05b8e27d05b8e27d05b8e27d05b8e27d05b8e27d05b8e27d05b8e27d0" # 冒名签发方 PRIV_AUDIT = "7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab7c4019ab" 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_CA = pub_of(PRIV_CA) PUB_CA_NEW = pub_of(PRIV_CA_NEW) PUB_ROGUE = pub_of(PRIV_ROGUE) PUB_AUDIT = pub_of(PRIV_AUDIT) def sm3_hex(data: bytes) -> str: return sm3.sm3_hash(func.bytes_to_list(data)) # ---- 手写 SM4-CBC(本篇用于审计快照的字段加密) ---- 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 字节(少一字节会 IndexError)" 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 # ======================================================================= # # 业务逻辑区 # ======================================================================= # sm2_ca = sm2.CryptSM2(public_key=PUB_CA, private_key=PRIV_CA) sm2_ca_new = sm2.CryptSM2(public_key=PUB_CA_NEW, private_key=PRIV_CA_NEW) sm2_rogue = sm2.CryptSM2(public_key=PUB_ROGUE, private_key=PRIV_ROGUE) sm2_audit = sm2.CryptSM2(public_key=PUB_AUDIT, private_key=PRIV_AUDIT) # --- 1) 轻量 CA 签发设备证书 --- cert = "cn=DEV-A1|sn=A10001|ca=lite-ca-01|nb=20260901|na=20270901" h_cert = sm3_hex(cert.encode("utf-8")) sig_cert = sm2_ca.sign(h_cert.encode("utf-8"), FIXED_K) ok_issue = sm2_ca.verify(sig_cert, h_cert.encode("utf-8")) h_cert_t = sm3_hex((cert + "&role=admin").encode("utf-8")) ok_cert_tamper = not sm2_ca.verify(sig_cert, h_cert_t.encode("utf-8")) sig_rogue = sm2_rogue.sign(h_cert.encode("utf-8"), FIXED_K) ok_rogue = not sm2_ca.verify(sig_rogue, h_cert.encode("utf-8")) # --- 2) CA 密钥轮换:新签证书用旧公钥验不过 --- cert2 = "cn=DEV-B2|sn=B20002|ca=lite-ca-02|nb=20260929|na=20270929" h_cert2 = sm3_hex(cert2.encode("utf-8")) sig_new = sm2_ca_new.sign(h_cert2.encode("utf-8"), FIXED_K) ok_rotate = not sm2_ca.verify(sig_new, h_cert2.encode("utf-8")) ok_rotate_new_ok = sm2_ca_new.verify(sig_new, h_cert2.encode("utf-8")) # --- 3) 签发台账整体签名 --- ledger = "batch=20260929-01|issued=128|revoked=2|first=A10001|last=A10128" h_led = sm3_hex(ledger.encode("utf-8")) sig_led = sm2_audit.sign(h_led.encode("utf-8"), FIXED_K) ok_ledger = sm2_audit.verify(sig_led, h_led.encode("utf-8")) h_led_t = sm3_hex(ledger.replace("issued=128", "issued=127").encode("utf-8")) ok_ledger_tamper = not sm2_audit.verify(sig_led, h_led_t.encode("utf-8")) # --- 4) 吊销列表:整体签名 + 命中判定 --- crl = "ca=lite-ca-01|revoked=A10007,A10093|ts=20260929T104500Z" h_crl = sm3_hex(crl.encode("utf-8")) sig_crl = sm2_audit.sign(h_crl.encode("utf-8"), FIXED_K) ok_crl = sm2_audit.verify(sig_crl, h_crl.encode("utf-8")) ok_revoked_hit = "A10007" in crl h_crl_t = sm3_hex(crl.replace("A10007,", "").encode("utf-8")) ok_crl_tamper = not sm2_audit.verify(sig_crl, h_crl_t.encode("utf-8")) # --- 5) 批次摘要链:改中间一条,链尾就变 --- GENESIS = "GENESIS" def chain(prev: str, rec: str) -> str: return sm3_hex((prev + "|" + rec).encode("utf-8")) r1 = "seq=1|op=issue|sn=A10001" r2 = "seq=2|op=issue|sn=A10002" r3 = "seq=3|op=revoke|sn=A10007" tail_a = chain(chain(chain(GENESIS, r1), r2), r3) tail_b = chain(chain(chain(GENESIS, r1), "seq=2|op=issue|sn=A10999"), r3) ok_chain_det = tail_a == chain(chain(chain(GENESIS, r1), r2), r3) ok_chain_change = tail_a != tail_b ok_chain_len = len(tail_a) == 64 # --- 6) 审计快照加密:只有审计方密钥能还原 --- KEY_AUDIT = bytes.fromhex(sm3_hex(b"AUDIT-SNAPSHOT-KEY-2026")[:32]) IV = b"16BYTEIVFORCRL01" assert len(IV) == 16 snap = (ledger + "|" + crl).encode("utf-8") ct = sm4_cbc(KEY_AUDIT, IV, pkcs7_pad(snap), True) ok_snap = pkcs7_unpad(sm4_cbc(KEY_AUDIT, IV, ct, False)) == snap ok_snap_key = pkcs7_unpad(sm4_cbc(bytes.fromhex(sm3_hex(b"OTHER-KEY-2026")[:32]), IV, ct, False)) != snap asserts = [ ("设备证书签名验签通过", ok_issue), ("证书字段被改后验签被拒绝", ok_cert_tamper), ("冒名签发方签发的证书被拒绝", ok_rogue), ("CA 轮换后旧公钥验不过新证书", ok_rotate), ("CA 轮换后新公钥可验新证书", ok_rotate_new_ok), ("签发台账签名验签通过", ok_ledger), ("台账数量被改后签名被拒绝", ok_ledger_tamper), ("吊销列表签名验签通过", ok_crl), ("吊销列表命中被吊销序列号", ok_revoked_hit), ("吊销列表被删一条后签名被拒绝", ok_crl_tamper), ("批次摘要链可复现", ok_chain_det), ("改中间一条后链尾摘要变化", ok_chain_change), ("链尾摘要长度为 64 位十六进制", ok_chain_len), ("审计快照仅审计方密钥可还原", ok_snap and ok_snap_key), ] # 首行必须是 '='*60:脚本靠它把「demo 输出块」与「ASCII 机制图」区分开 print("=" * 60) for t, ok in asserts: print(f"[{t}] = {'True' if ok else 'False'}")============================================================ [设备证书签名验签通过] = True [证书字段被改后验签被拒绝] = True [冒名签发方签发的证书被拒绝] = True [CA 轮换后旧公钥验不过新证书] = True [CA 轮换后新公钥可验新证书] = True [签发台账签名验签通过] = True [台账数量被改后签名被拒绝] = True [吊销列表签名验签通过] = True [吊销列表命中被吊销序列号] = True [吊销列表被删一条后签名被拒绝] = True [批次摘要链可复现] = True [改中间一条后链尾摘要变化] = True [链尾摘要长度为 64 位十六进制] = True [审计快照仅审计方密钥可还原] = True逐段读一下这段代码在验什么。第 13 条验签发:正常签名能验过,证书字段被加一项、换一把 CA 私钥签发,都要被拒——这里用换私钥构造冒名,只改字段验的是完整性而不是身份。第 45 条验轮换:CA 换了以后,新签的证书用旧公钥验不过、用新公钥能验过。第 67 条验台账:整体签名能验过,把签发数量从 128 改成 127 就被拒。第 810 条验吊销:列表签名能验过、能命中被吊销的序列号、删掉一条就验签失败。第 11~13 条验摘要链:链尾可复现、改中间一条链尾就变、链尾是 64 位十六进制。第 14 条验审计快照:只有审计方密钥能还原,换一把密钥还原出的不是原文。
现场演示时最能说明问题的是第 7 条和第 12 条:把台账里的 128 改成 127、把中间那条记录的序列号改掉,两次都应该直接失败。这两条把"台账不可篡改"和"批次可追溯"从文档里的词变成了可演示的事实。
要注意一处工程细节:演示里用的是固定 K 的 SM2 签名,目的是让每次输出一致、便于复现;真实系统里签名随机数必须由密码模块内部产生,同一私钥配同一个 K 会泄露私钥。
04 | 落地动作:合规审计轻量级证书签发系统分四条线怎么做
合规审计轻量级证书签发系统的落地,建议按四条线分开推进,每条线给一个可验收的动作。
身份认证轻量级证书签发系统的证书签发这条线,动作是把签名字段清单定死并写进方案。持有者名称、序列号、签发者标识、有效期起止、用途扩展,一个都不能漏签;改任何一个字段都要重新签名。验收点:把有效期改长一年,验签必须失败。
吊销这条线,动作是把吊销从"删配置"改成"写列表并签名"。吊销请求进系统后生成一份带签名的列表增量,校验方先验签再查命中;列表整体签名,删一条即失败。验收点:删掉列表里的一条序列号,验签失败。
台账这条线,动作是给每批签发一个批次号,并记录首尾序列号与签发、吊销两个数量。批次整体算摘要并签名,作为这一批的凭证。验收点:改数量,验签失败。
摘要链这条线,动作是把逐条记录串成链。每条记录写入时,取上一条链值与本条内容共同计算新链值;审计时从创世值重算一遍,链尾一致即说明中间没被动过。验收点:改中间任意一条,链尾变化。
整改样本(某高校物联网终端项目)。背景:两万张设备证书,签发记录分散在三台服务器,吊销靠手工改配置,评审要求补审计链。动作:先定签名字段清单并统一签发入口(三周),再把吊销改为签名列表并给校验方加命中校验(四周),然后给每批签发加批次号与首尾序列号(两周),最后把逐条记录串成摘要链并生成可带走的审计快照(三周)。结果:轻量级证书签发系统合规审计方案要求的四件事全部落地,台账可给出"某批签发 128 张、已吊销 2 张"的签名凭证,改一条即验签失败,预评估的审计留痕项从"不符合"转为"符合",总周期约三个月。真正花时间的不是加签名,而是把三个签发入口收敛成一个。
05 | 避坑清单:8 条最容易踩的坑
| # | 坑 | 后果 | 怎么验证避开了 |
|---|---|---|---|
| 1 | 只签序列号不签全部字段 | 有效期可被改长 | 改一个字段,验签必须失败 |
| 2 | 吊销靠删配置 | 无记录、不可举证 | 吊销写成带签名的列表 |
| 3 | 校验方只验签不查吊销列表 | 已吊销证书仍在用 | 验签通过后仍查命中 |
| 4 | 台账存应用库、可改 | 评审追问即露馅 | 整体签名,改一条即失败 |
| 5 | 没有批次号 | 定位不到是哪一批 | 每批有编号与首尾序列号 |
| 6 | 只记签发不记吊销 | 拼不出有效数量 | 两个数量同时进台账 |
| 7 | 审计快照是可编辑表格 | 出了系统就失效 | 快照加密且仅审计方可还原 |
| 8 | CA 轮换不做验签切换 | 新证书全验不过 | 旧公钥验不过、新公钥能验 |
| 9 | 演示沿用固定 K | 私钥有泄露风险 | 随机数由密码模块产生 |
| 10 | 多个签发入口 | 台账天然对不上 | 收敛成一个统一入口 |
展开说第 2 条。吊销靠删配置最省事,也最致命:删完以后系统里查不到这张证书,看起来干净,实际上"它曾经存在过、什么时候失效的、谁批的"全都消失了。评审追的从来不是"现在还有没有这张证书",而是"它的全生命周期能不能还原"。把吊销改成写列表并签名,改造量不大——多一份列表、多一次签名、校验方多一步命中查询——换来的是整条生命周期可举证。
06 | 合规视角:合规审计轻量级证书签发系统要对上哪些要求
合规审计轻量级证书签发系统要对的合规要求,集中在下面几条。商用密码应用安全性评估(GB/T 39786)。证书系统相关的核查集中在密钥管理与证书生命周期管理:密钥在密码模块内产生与存放,证书签发、吊销、更新有完整记录,记录可核查。前面四条线,落到密码就是字段整体签名、吊销列表签名、批次台账签名、摘要链。测评会追问算法、密钥存放方式、轮换周期与记录留存期限,这些要写进密码应用方案。
网络安全等级保护(GB/T 22239-2019)。三级系统对安全审计有明确要求,审计记录应包括事件的日期时间、主体、客体、类型与结果,且不可修改、不可删除。证书签发与吊销正属于应当审计的事件;用应用日志拼接的台账,通常过不了"不可修改"这一条。
电子签名法与商用密码相关法规。涉及电子签名的场景,证书本身是签名可靠性的支撑之一;商用密码相关法规要求密码应用与安全性评估衔接。轻量级证书签发系统合规审计方案里,应明确哪些环节用了商用密码算法、由哪个模块提供保护。
实用建议是:不要把这些要求当成几份独立清单分别应对,而是建一张映射表,把每条要求映射到"字段整体签名、吊销列表签名、批次台账签名、摘要链"这四个动作上。一次建设,几份清单同时受益。
07 | 落地答案:合规审计轻量级证书签发系统怎么承接
合规审计轻量级证书签发系统的落地,落到产品能力上通常这样组合四条线。
身份认证轻量级证书签发系统这一段,需要的能力是"SM2 对证书字段整体签名 + 统一签发入口"。轻量级证书签发系统承接签发,签名字段清单由方案定死;CA 私钥由密钥服务平台托管、根密钥在硬件密码机内,轮换时新旧公钥并存一段时间以便平滑切换。
吊销这一段,需要的能力是"吊销列表整体签名 + 校验方命中判定"。列表增量生成即签名,校验方先验签再查序列号;列表的每一次变更都进审计台账。
台账这一段,需要的能力是"批次号 + 整体签名"。集中密钥管理系统按批次派生并记录首尾序列号,批次台账算摘要后由审计密钥整体签名,改一条即失败。
留痕这一段,需要的能力是"摘要链 + 审计快照"。逐条记录串成摘要链,审计方带走的是加密快照,只有审计方密钥能还原;四段能力的组合正好覆盖证书生命周期的全部审计点,也直接对应 06 节那几份清单的核查项。
08 | 验收清单与下一步
上线前建议逐项过一遍这张表:
| # | 验收项 | 通过标准 |
|---|---|---|
| 1 | 签名字段清单 | 覆盖持有者、序列号、签发者、有效期、用途 |
| 2 | 字段完整性 | 改任一字段验签失败 |
| 3 | 冒名签发 | 换 CA 私钥签发的证书被拒 |
| 4 | 吊销形态 | 吊销为带签名的列表,非删配置 |
| 5 | 吊销命中 | 校验方验签通过后再查序列号 |
| 6 | 吊销列表完整性 | 删一条即验签失败 |
| 7 | 批次号 | 每批有编号、首尾序列号 |
| 8 | 台账数量 | 签发数与吊销数同时记录 |
| 9 | 台账完整性 | 改数量即验签失败 |
| 10 | 摘要链 | 链尾可复现、改中间即变 |
| 11 | 审计快照 | 仅审计方密钥可还原 |
| 12 | CA 轮换 | 旧公钥验不过新证书、新公钥可验 |
| 13 | 签发入口 | 全系统仅一个统一入口 |
| 14 | 留存期限 | 签发吊销记录留存期明确 |
| 15 | 映射表 | 每条要求映射到四个动作 |
趋势上看,证书系统的检查重心正在从"能不能签发"走向"签发了能不能说清楚"。过去只要设备能接入就算及格;现在评审会追到这一批签了多少、吊销了几张、台账改一个字能不能被发现。这个迁移对架构的实质要求是:签发与吊销必须共用一套签名与台账机制,轻量级证书签发系统合规审计方案里,审计不能再是事后补的日志。
下一篇预告:我们回到身份平台,看统一身份认证系统国家标准这条线上,标准符合性、实施案例与密钥管理怎么落到同一份可提交的证据里。
09 | 常见问题:合规审计轻量级证书签发系统的 4 个高频疑问
- Q: 合规审计轻量级证书签发系统的台账要怎么做才不可篡改?
- A: 结论是台账要整体签名,而不是靠数据库权限控制。把批次号、签发数、吊销数、首尾序列号拼成一条记录算 SM3 摘要,用审计密钥做 SM2 签名;改任何一个数,验签即失败。再配合逐条记录的摘要链,改中间一条也会被链尾发现。
- Q: 轻量级证书签发系统合规审计方案里的吊销环节要怎么做才合规?
- A: 结论是吊销必须写成"带签名的列表 + 校验方命中查询",不能写成"删除配置"。吊销请求进系统后生成列表增量并整体签名,校验方先验签再查序列号是否在列表里;列表被删一条,签名就验不过。
- Q: 身份认证轻量级证书签发系统的设备证书要怎么做才能防冒名签发?
- A: 结论是证书全部关键字段都要进签名,且签发入口必须收敛为一个。持有者、序列号、签发者、有效期、用途一起算摘要后再签,只签序列号会被改有效期绕过;同时收敛签发入口,多个入口必然导致台账对不上。
- Q: 轻量级证书签发系统合规审计需要多久才能补齐?
- A: 周期主要取决于签发入口是否收敛。入口已经统一、只差签名与台账的,四到六周可补齐;存在多个签发入口、吊销靠手工改配置的,往往要三到四个月。真正拉长周期的是入口收敛与历史台账重建,不是加签验签本身。
相关阅读
- 工业互联网平台安全防护的凭据跨平面隔离
- 高校核心系统密评方案的四层面证据链
- 智慧社区门禁身份认证的本地比对与事件签名
文章作者:安当加密-焱垚