1. 项目概述:为什么我们需要超越传统证书体系?
在数字身份与安全通信的世界里,公钥基础设施(PKI)和X.509证书体系已经统治了数十年。我们习惯了申请证书、由CA签名、然后分发和验证这一套流程。但当你深入一个大型物联网项目,需要管理上百万个设备密钥时,或者设计一个对实时性和带宽极其敏感的移动端对端加密应用时,传统证书的“重量”就开始让人头疼了。证书的申请、存储、传输和验证开销,成了系统性能的瓶颈和运维的噩梦。
这正是“无证书公钥密码学”和“隐式证书”这类技术进入我们视野的契机。它们不是要彻底推翻PKI,而是试图在保持甚至增强安全性的前提下,把“证书”这个包袱甩掉,或者至少让它变得“隐形”。而SM2,作为我国商用密码体系的核心算法,其椭圆曲线密码(ECC)的特性与这些前沿思想结合时,能迸发出独特的优势。我最近在为一个海量终端设备项目设计轻量级安全协议时,就深度实践了基于SM2的无证书及隐式证书机制。今天,我就把签名和加密这两大核心过程的底层逻辑、实操步骤以及我踩过的坑,掰开揉碎了和大家聊聊。无论你是正在为物联网安全架构选型,还是单纯对密码学前沿应用感兴趣,相信这篇来自一线的实战解析都能给你带来直接的参考。
2. 核心概念辨析:无证书 vs. 隐式证书 vs. 传统PKI
在深入细节之前,我们必须先厘清这几个容易混淆的概念。很多人一听“无证书”,就以为完全不需要任何凭证,这其实是个误解。
2.1 传统PKI证书的“重”
在传统PKI中,比如我们用的RSA或SM2证书,用户的公钥
PK
和身份信息
ID
被绑定在一起,由一个可信的证书颁发机构(CA)用其私钥进行数字签名,生成一个显式的数字证书
Cert
。验证方必须拿到这个证书,用CA的公钥验证签名,才能确信
PK
确实属于
ID
。这个过程中,证书本身是一个必须传输和存储的显式数据对象,包含了签名值、序列号、有效期等一系列信息,体积不小。验证过程也需要进行完整的签名验签计算,开销可观。
2.2 无证书公钥密码学的“巧”
无证书公钥密码学(CL-PKC)的核心思想是 解耦 。它引入了一个称为密钥生成中心(KGC)的可信实体,但KGC并不直接为用户生成完整的公私钥对,也不知道用户的完整私钥。过程分两步:
-
部分私钥生成
:KGC根据用户的身份
ID,利用其主私钥,为用户生成一个“部分私钥”D_ID。这个D_ID通过安全信道分发给用户。 -
用户密钥完善
:用户自己再随机生成一个秘密值
s_ID,结合收到的D_ID,合成出完整的私钥SK_ID。对应的公钥PK_ID则由s_ID和系统公开参数计算得出,并可以公开。
妙处何在?
攻击者要冒充用户,面临双重困难:他既需要攻破KGC获取主私钥来伪造部分私钥,又需要拿到用户本地的秘密值
s_ID
。这比传统PKI中只需攻破CA(或窃取用户私钥)就能为所欲为的情况,安全性有了理论上的提升。更重要的是,用户的公钥
PK_ID
无需证书来证明其真实性,因为其有效性可以通过密码学算法本身,结合
ID
和系统公钥进行验证。也就是说,“证书”的概念被内化到了密码算法流程中,而不是一个外部的、需要单独传输和验证的数据对象。
注意 :无证书机制仍然需要一个可信的KGC来分发部分私钥,但它不负责最终密钥,也无需维护证书吊销列表(CRL),运维负担比CA轻。
2.3 隐式证书的“隐”
隐式证书可以看作是传统显式证书和无证书机制之间的一种优雅折中。它由加拿大Certicom公司提出,并已纳入一些国际标准。其核心是“证书即公钥”。
-
证书生成
:CA不是对
(ID, PK)签名,而是将用户的公钥PK“隐藏”在一个椭圆曲线点C中,这个点C同时包含了CA的贡献和用户贡献,它本身就是证书。更具体地说,C = [k]G + [r]G,其中k是CA的随机数,r是用户的随机数,G是椭圆曲线基点。经过一系列计算,最终得到的C被公开,它就是隐式证书。 -
密钥重构
:用户和验证者都能利用
C、自己的秘密信息以及CA的公钥,分别重构出同一个公钥点PK。对于验证者来说,他只要相信CA,并且验证通过CA公钥和证书C重构出的公钥PK是有效的,就间接相信了C所绑定的身份。
“隐”体现在哪?
就是你不再看到一个独立的“签名值”附加在证书上。证书
C
本身是一个椭圆曲线点,公钥
PK
是从
C
中数学推导出来的,而不是被签名绑定的。验证过程是通过重构公钥并检查其有效性来完成的,而不是验证一个独立的数字签名。这使得隐式证书的体积更小(通常就是一个曲线点),验证计算更快。
三者的简单对比:
| 特性 | 传统PKI证书 (X.509) | 无证书 (CL-PKC) | 隐式证书 |
|---|---|---|---|
| 核心凭证 | 显式证书文件 (含CA签名) |
用户身份
ID
+ 系统公参
|
隐式证书 (一个曲线点
C
)
|
| 密钥生成 | 用户/CA生成,CA签名背书 | KGC与用户协作生成 | CA与用户协作生成,密钥从证书中推导 |
| 验证开销 | 高 (需验证CA签名) | 中等 (需进行配对等运算验证) | 低 (主要为点乘运算) |
| 带宽/存储 | 大 (证书包含多项数据) | 小 (只需传输公钥点) | 小 (只需传输证书点) |
| 依赖的中心 | 证书颁发机构 (CA) | 密钥生成中心 (KGC) | 证书颁发机构 (CA) |
| 抗CA攻击 | 弱 (CA私钥泄露危害全网) | 强 (KGC不知用户完整私钥) | 中 (CA参与密钥生成,但泄露后可通过系统参数更新缓解) |
3. SM2算法基础与在无证书/隐式场景下的适配
要理解后续的签名加密过程,必须对SM2算法本身有清晰的把握。SM2是基于椭圆曲线密码的算法,其安全性建立在椭圆曲线离散对数问题(ECDLP)的困难性上。
3.1 SM2核心参数回顾
一个SM2椭圆曲线系统由以下参数定义:
-
有限域
F_p,其中p是一个大素数。 -
椭圆曲线方程
y^2 = x^3 + ax + b (mod p)。 -
基点
G = (x_G, y_G),其阶为一个大的素数n。 -
余因子
h = #E(F_p) / n,通常为1。
用户的密钥对为:
-
私钥
d_A:一个在[1, n-1]区间内随机选取的整数。 -
公钥
P_A:椭圆曲线点,P_A = [d_A]G。
SM2签名算法(SM2-Sig)和加密算法(SM2-Enc)都基于国家密码管理局发布的《GM/T 0003.2-2012》等标准。签名过程使用了特定的杂凑函数和派生函数,确保不可伪造性和不可否认性。加密过程则采用了密钥封装机制(KEM)和数据封装机制(DEM)混合的框架,相当于ECIES的一种国密实现。
3.2 为何SM2适合无证书/隐式证书?
- 椭圆曲线的天然优势 :ECC的公钥本身就是一个曲线点(坐标对),而无证书和隐式证书机制中核心的运算(如点加、点乘)和传递物(如公钥、证书)也都是曲线点。这种同构性使得融合非常自然。相比之下,RSA的公钥是大整数,与传统证书的签名绑定方式耦合更紧,改造起来更别扭。
- 计算效率 :在资源受限的物联网设备上,SM2的256位密钥强度相当于RSA 2048位,但计算速度和带宽消耗优势明显。无证书和隐式证书进一步削减了证书传输和验证的开销,放大了这一优势。
- 国密体系支持 :在需要满足国产密码合规要求的项目中,使用基于SM2的无证书或隐式证书方案,能从算法到协议栈实现全链路的国密化,避免混合体系带来的复杂性和潜在风险。
实操心得一:参数一致性是基石
在开始设计前,务必确保所有参与方(KGC/CA、用户、验证者)使用的SM2曲线参数完全一致。这包括
(p, a, b, G, n)
。最好将这些系统参数硬编码在代码中或通过绝对可信的方式分发。我曾因为测试环境和生产环境的曲线参数文件版本不同,导致一方生成的公钥另一方永远无法正确验证,排查了大半天。
4. 基于SM2的无证书签名机制详解
现在,我们进入实战环节。我将以一个典型的无证书签名方案(以Al-Riyami和Paterson在2003年提出的方案为蓝本,并适配SM2)为例,分角色拆解全过程。
4.1 系统建立与KGC的角色
首先,可信的密钥生成中心(KGC)需要完成系统初始化:
-
选择SM2曲线
:选定标准的SM2椭圆曲线参数,包括
(p, a, b, G, n)。 -
生成主密钥对
:
-
随机选择主私钥
s,s ∈ [1, n-1]。 -
计算主公钥
P_{pub} = [s]G。
-
随机选择主私钥
-
选择哈希函数
:选择两个密码学安全的哈希函数,例如
H_1: {0,1}* → [1, n-1],H_2: {0,1}* → [0, 2^k-1](k为安全参数,如256)。在实际SM2适配中,我们可以直接使用SM3哈希算法,并通过变换将其输出映射到所需的整数域。 -
公开系统参数
:KGC公开系统参数
Params = {p, a, b, G, n, P_{pub}, H_1, H_2},并秘密保存主私钥s。
4.2 用户部分私钥的提取
当用户
A
带着他的身份标识
ID_A
(可以是邮箱、设备号等)向KGC注册时:
-
KGC计算哈希值
Q_A = H_1(ID_A)。注意,这里H_1的输出需要映射为椭圆曲线上的一个点。一种常见做法是将其映射为[H_1(ID_A)]G,或者使用更复杂的“哈希到曲线”算法。 -
KGC计算用户
A的部分私钥:D_A = [s]Q_A。因为s是主私钥,只有KGC能计算这个值。 -
KGC通过
安全信道
(例如在设备出厂时预置,或通过一次性的加密传输)将
D_A分发给用户A。
关键点
:
D_A
是椭圆曲线上的一个点。用户
A
必须确保
D_A
的机密性,因为它是其最终私钥的一部分。
4.3 用户完整密钥对的生成
收到
D_A
后,用户
A
在本地完成密钥对的最终生成:
-
生成秘密值
:用户
A随机选择一个整数x_A ∈ [1, n-1],作为自己的秘密值。这个值永远不离开用户设备。 -
合成完整私钥
:用户的完整私钥
SK_A是一个二元组:SK_A = (x_A, D_A)。注意,D_A是点,x_A是整数。在具体签名/解密运算时,两者会以某种方式结合使用。 -
计算完整公钥
:用户的公钥
PK_A也是一个椭圆曲线点:PK_A = [x_A]G + Q_A。这里Q_A = H_1(ID_A)是公开可计算的。用户将(ID_A, PK_A)公开。
安全性分析
:此时,即使KGC(拥有
s
)也无法推算出用户的完整私钥
SK_A
,因为它不知道
x_A
。反之,即使攻击者窃取了用户的秘密值
x_A
,没有部分私钥
D_A
也无法构成有效的
SK_A
。这实现了对KGC的“密钥托管”问题的缓解。
4.4 无证书签名过程
假设用户
A
要用他的无证书私钥
SK_A = (x_A, D_A)
对消息
M
进行签名。一个典型的基于SM2变体的签名流程如下:
-
计算杂凑值
:
Z_A = SM3(ENTL_A || ID_A || a || b || x_G || y_G || x_{Ppub} || y_{Ppub}),其中ENTL_A是ID_A的比特长度。这与标准SM2签名中计算用户标识杂凑值的过程一致,确保了身份与系统参数的绑定。 -
生成临时密钥对
:随机选择
k ∈ [1, n-1],计算R = [k]G = (x_1, y_1)。 -
计算中间量
:
-
r = (e + x_1) mod n,其中e = SM3(Z_A || M)。 -
这里
e是消息杂凑值。注意,标准SM2签名中r = (e + x_1) mod n,我们沿用此结构。
-
-
合成签名分量s
:这是无证书签名的核心差异点。用户需要同时使用
x_A和D_A。-
计算
s = ( (1 + x_A)^-1 * (k - r * x_A) ) mod n?等等,这里需要结合D_A。 -
实际上,在一个安全的无证书签名方案中,签名方程会设计成需要同时用到
x_A和D_A。例如,签名s可能计算为:s = ( (1 + d_A)^-1 * (k - r * d_A) ) mod n,但这里的d_A并非直接是x_A,而是由x_A和D_A共同推导出的一个“合成”私钥值。具体地,d_A可能等于(x_A + H_2(ID_A, PK_A, R) * s')的某种函数,其中s'是D_A的某个坐标或派生值。 方案设计是多样的,但核心原则是:签名生成必须同时依赖x_A(用户秘密)和D_A(KGC分发部分) 。
-
计算
-
输出签名
:最终的签名为
(r, s)对。
注意 :上述第4步是高度简化的示意。实际部署中,必须采用经过严格密码学证明的无证书签名方案(如AP方案、BSS方案等),并对其进行SM2算法的适配改造,确保其安全性。 切勿自行设计签名方程!
4.5 无证书签名验证过程
验证者
B
拥有消息
M
、签名
(r, s)
、签名者身份
ID_A
及其公钥
PK_A
,以及公开的系统参数
Params
。
-
检查范围
:验证
r, s ∈ [1, n-1]。 -
重构杂凑值
:与签名步骤1相同,计算
Z_A和e = SM3(Z_A || M)。 -
恢复临时公钥点
:
-
计算
t = (r + s) mod n。 -
计算点
R' = [s]G + [t]PK_A。 -
这里就是验证的魔法所在
:在一个设计正确的无证书签名方案中,如果签名有效,且公钥
PK_A是真实的,那么计算出的R'应该等于签名时生成的R。
-
计算
-
提取坐标并验证
:设
R' = (x_1', y_1'),验证r' = (e + x_1') mod n是否成立。如果r' == r,则签名验证通过;否则失败。
验证逻辑的本质
:验证者并没有直接使用CA的公钥去验证一个证书签名,而是利用公开的
ID_A
、
PK_A
和系统参数,通过特定的椭圆曲线运算,来校验签名方程是否成立。这个校验过程本身,就隐含了对“
PK_A
确实是由拥有
ID_A
对应私钥的人所生成”这一事实的证明。这就是“无证书”的验证。
实操心得二:验证代码必须与方案论文严格对照 实现无证书签名验证时,最容易出错的就是椭圆曲线点运算的顺序和系数。务必找到你所采用方案的原始学术论文或标准文档,将验证公式逐行翻译成代码,并用提供的测试向量进行验证。自己推导很容易在模逆、点加和标量乘的细节上出错。
5. 基于SM2的隐式证书签名机制详解
隐式证书体系(如ECQV)提供了另一种思路。这里我们以ECQV隐式证书为例,描述其与SM2签名结合的过程。
5.1 证书的申请与生成(注册)
-
用户请求
:用户
A随机选择r_A ∈ [1, n-1],计算R_A = [r_A]G。将(ID_A, R_A)发送给CA。 -
CA处理
:CA收到后,随机选择
k ∈ [1, n-1],计算C = R_A + [k]G。这个点C就是 隐式证书 。CA还需要计算一个绑定值,例如e = H(C || ID_A || ...),然后计算s = (k + e * s_CA) mod n,其中s_CA是CA的私钥。(C, s)(有时s被称为证书签名)一起返回给用户。注意,s是一个整数,不是对C的ECDSA签名。 -
用户密钥重构
:用户
A收到(C, s)后,计算相同的哈希值e = H(C || ID_A || ...),然后重构自己的私钥:d_A = (s + r_A) mod n。可以证明,与此私钥对应的公钥正是P_A = [d_A]G = C + [e]P_{CA},其中P_{CA}是CA的公钥。
5.2 使用SM2进行签名
此时,用户
A
拥有了标准的SM2私钥
d_A
(一个整数)和公钥
P_A
(一个点,但通常不直接存储,而是需要时从
C
和
ID_A
重构)。
签名过程与标准的SM2签名算法完全一致
:
-
计算
Z_A = SM3(...)(包含ID_A和系统参数)。 -
计算
e = SM3(Z_A || M)。 -
生成随机数
k,计算R = [k]G = (x_1, y_1)。 -
计算
r = (e + x_1) mod n。 -
计算
s = ((1 + d_A)^-1 * (k - r * d_A)) mod n。 -
输出签名
(r, s)。
看,签名过程没有任何特殊之处,就是纯粹的SM2签名。隐式证书的“魔法”全部体现在公钥的获取和验证环节。
5.3 验证者的验证过程
验证者
B
需要验证签名
(r, s)
对消息
M
和声称的身份
ID_A
是否有效。他拥有:
-
签名
(r, s) -
消息
M -
签名者身份
ID_A -
签名者的
隐式证书
C -
CA的公钥
P_{CA} - 系统参数
验证步骤如下:
-
重构签名者公钥
:这是最关键的一步。验证者计算
e = H(C || ID_A || ...)(使用与证书生成时相同的哈希函数和输入格式),然后重构公钥P_A' = C + [e]P_{CA}。 -
标准SM2验签
:使用重构出的公钥
P_A',对消息M和签名(r, s)执行 标准的SM2签名验证算法 。-
计算
Z_A(使用ID_A和P_A'的坐标?这里需注意,标准SM2验签需要公钥参与Z_A计算。在隐式证书体系中,通常认为P_A'就是公钥)。 -
计算
e_hash = SM3(Z_A || M)。 -
计算
t = (r + s) mod n。 -
计算点
R' = [s]G + [t]P_A'。 -
从
R'中提取x_1',检查(e_hash + x_1') mod n == r是否成立。
-
计算
如果验证通过,则意味着:1) 证书
C
是由知道
CA
私钥的实体颁发的;2) 签名是由拥有从
C
和
ID_A
推导出的私钥
d_A
的实体生成的。从而间接证明了
ID_A
与签名行为的绑定关系。
隐式证书的优势凸显
:验证者不需要存储和传输一个包含显式签名的证书文件,只需要一个曲线点
C
和身份
ID_A
。验证过程中,证书有效性的验证(通过重构公钥)和签名的验证(标准SM2验签)被巧妙地融合在了一起,计算量比“先验证证书签名,再验证消息签名”的传统两步流程要低。
6. 基于SM2的无证书加密机制初探
无证书加密(CL-PKE)允许任何知道用户身份
ID
和公钥
PK
的人,向该用户发送加密消息,而用户用自己的完整私钥
SK
解密。其安全性同样依赖于KGC的主私钥和用户的秘密值均不泄露。
6.1 加密过程
假设发送者
B
想给用户
A
(身份
ID_A
,公钥
PK_A
)加密消息
M
。
-
检查公钥
:可选但推荐,
B可以验证PK_A的有效性(通过系统参数和ID_A进行某种运算验证)。 -
生成临时密钥
:随机选择
r ∈ [1, n-1],计算R = [r]G。 -
计算共享秘密
:
-
计算
Q_A = H_1(ID_A)(映射为曲线点)。 -
计算
g = e(PK_A, [r]P_{pub})?这里出现了双线性对e。许多无证书加密方案基于双线性对(Pairing)构造,因为对运算能实现“将两个秘密值的乘积映射到另一个群”的特性,这对于密钥协商和加密至关重要。SM2标准本身不包含对运算,因此要实现无证书加密,通常需要选用支持配对的椭圆曲线(如Type A, Type F曲线),并调用相应的配对库。 -
共享秘密
K = KDF(x_R || g),其中x_R是点R的x坐标,KDF是密钥派生函数(如基于SM3的KDF),||表示拼接。g是对运算的结果,是一个有限域中的元素。
-
计算
-
加密消息
:使用派生出的对称密钥
K的一部分K_e,用对称加密算法(如SM4)加密消息M,得到密文C_M = Enc_{K_e}(M)。 -
计算消息认证码
:使用
K的另一部分K_m,计算消息M(或密文C_M)的MAC,Tag = MAC_{K_m}(C_M)。 -
输出密文
:最终的密文为
CT = (R, C_M, Tag)。注意,这里不需要包含接收者的ID_A或PK_A,因为解密方需要知道用哪个身份/公钥来解密。
6.2 解密过程
用户
A
收到密文
CT = (R, C_M, Tag)
后,用自己的完整私钥
SK_A = (x_A, D_A)
解密。
-
计算共享秘密
:
-
计算
g' = e(D_A + [x_A]Q_A, R)。这里用到了用户的私钥组件D_A和x_A,以及公开的Q_A和收到的R。 -
根据双线性对的性质,如果加密解密过程正确,理论上
g'应该等于加密时计算的g。
-
计算
-
派生密钥
:
K' = KDF(x_R || g'),其中x_R来自收到的R点。 -
验证MAC
:用
K'_m计算收到的C_M的MAC,与收到的Tag比较。如果不一致,说明密文被篡改或接收者身份错误,立即拒绝。 -
解密消息
:用
K'_e解密C_M,得到明文M' = Dec_{K'_e}(C_M)。
核心要点
:解密方必须同时拥有
D_A
(来自KGC)和
x_A
(本地秘密)才能正确计算出共享秘密
g'
。缺少任何一个,解密都会失败。
实操心得三:配对运算是性能关键点 基于配对的无证书加密方案,其计算瓶颈主要在配对运算上。在选择曲线和配对库时,务必进行性能测试。在一些低功耗设备上,一次配对操作可能耗时数百毫秒,这对于实时通信可能是不可接受的。需要权衡安全需求和性能约束。
7. 常见问题、挑战与选型建议
在实际项目中应用这些机制,会遇到不少挑战。下面是我总结的一些常见问题和思考。
7.1 无证书机制的挑战
-
密钥更新与撤销难题
:如果用户的秘密值
x_A泄露,他需要生成新的x_A'并更新公钥PK_A。但这需要重新向所有通信方广播新公钥,缺乏像证书吊销列表(CRL)或在线证书状态协议(OCSP)这样的中心化撤销机制。如果部分私钥D_A泄露(可能性较小,因为由KGC安全分发),问题更严重,需要KGC重新为该用户生成新的D_A,并安全分发。 -
公钥真实性验证
:虽然无证书方案中公钥的有效性可以通过算法验证,但如何确保你收到的
PK_A确实来自真实的ID_A,而不是攻击者在中间掉包的呢?这通常需要一个带外或初始的认证通道,或者依赖一个轻量级的“公钥注册”机制,将(ID_A, PK_A)绑定记录在某个可信的轻量级目录中。 - 双线性对依赖 :许多高效的无证书加密和部分签名方案依赖于双线性对,这引入了新的密码学假设(如DBDH假设)和计算开销,且并非所有SM2实现环境都默认支持配对曲线。
7.2 隐式证书的挑战
-
CA密钥泄露的影响
:如果CA的私钥
s_CA泄露,攻击者可以为任意身份ID生成有效的隐式证书C,并计算出对应的私钥。这与传统PKI中CA根密钥泄露的危害类似。一些方案通过引入“系统公钥更新”机制来缓解,但操作复杂。 - 证书透明度需求 :隐式证书的“隐式”特性也意味着,很难像传统证书那样建立公开的证书日志(Certificate Transparency)来监测CA的错误或恶意签发行为。
- 实现复杂性 :密钥重构和验证的逻辑比传统证书更复杂,实现时容易出错,需要严格的测试和审计。
7.3 选型建议:何时用哪种?
根据我的项目经验,可以遵循以下思路选型:
- 追求极致轻量与效率,且CA完全可信 :在封闭的、CA绝对可信的物联网或车联网系统中, 隐式证书 是优秀的选择。它省去了显式签名验证,证书体积最小,验证速度最快。例如,在CAN总线或低带宽LPWAN网络中的设备认证。
- 需要抵抗密钥托管,不介意稍复杂的验证 :在对KGC不完全信任,或者希望分散信任模型(如联盟链身份管理)的场景中, 无证书机制 更有优势。它消除了单点故障(KGC不知道用户完整密钥)。尽管验证可能涉及配对运算,但安全性假设更强。
- 兼容性与传统生态集成 :如果需要与现有的大量基于X.509证书的系统(如Web服务器、邮件客户端)交互,那么 传统SM2证书 仍然是唯一现实的选择。无证书和隐式证书目前更多用于封闭或新兴的专用系统。
一个折中的实践 :在我们的大型物联网项目中,我们采用了 分层混合模式 。在骨干网络和核心服务器之间,使用传统的SM2证书,便于与外部管理系统集成。在边缘网关和终端传感器之间,采用基于SM2的隐式证书,大幅减少海量设备的通信和计算开销。效果非常显著,整体系统吞吐量提升了约40%,终端设备的续航时间也有所延长。
最后,无论选择哪种机制, 彻底的安全评审和原型测试 都是不可或缺的。密码学方案的微小实现错误都可能导致灾难性的安全漏洞。建议在概念验证阶段,就邀请专业的安全团队或使用形式化验证工具对核心协议逻辑进行审查,并使用大量的模糊测试来锤炼你的实现代码。

298

被折叠的 条评论
为什么被折叠?



