1. 先搞清楚:Web3 里的密码学到底在解决什么问题
1.1 从“信任中介”到“数学共识”
Web3 这个概念被聊烂了,但真正动手做开发或安全的人都会有一个共识:密码学才是这套系统真正的地基。钱包的本质是密钥管理,交易的合法性靠数字签名保证,区块的完整性靠哈希链维护,Layer 2 和隐私方案背后则是默克尔树、零知识证明和一整套承诺机制。如果你想把 Web3 当成一门手艺来学,而不是追热词,那从密码学切入是最划算的路径。
传统互联网的信任模式很简单:平台说了算。你在某个网站上登录、转账、改资料,背后是平台数据库里的一行记录和几个内部权限接口。用户相信平台不会篡改,平台也确实有动机维护好自己的信誉。但在 Web3 的场景里,没有这种“可信第三方”。参与网络的节点彼此不认识,甚至互相有利益冲突,这时候怎么让系统稳定运行?密码学给出的答案是把“信任”换成“可验证”:不需要相信任何人,只需要验证数学上成立的东西。
具体到一条区块链交易上,链路是这样的:私钥持有者生成一段签名,签名只对这笔交易有效,全网任何人可以用公钥验证签名、确认这笔交易确实出自私钥持有者之手;交易被打包进区块后,区块头里存着一个根哈希,任何人对某个历史状态有疑问,都可以用默克尔证明快速验证数据是否被篡改。这套机制不依赖任何机构的诚信,只依赖数学假设是否成立。
我见过不少朋友转行 Web3 时一上来就学 Solidity、看智能合约代码,结果遇到安全问题一脸懵:为什么这里要校验返回地址?为什么签名会被重放?为什么随机数不能自己写?这些问题的根都在密码学。密码学不是一门可以跳过的“选修课”,它是整个体系的安全边界。
1.2 Web3 密码学的四大支柱:哈希、签名、承诺与证明
把 Web3 涉及的密码学知识拆开看,核心能力可以归成四类,理解这四类也就抓住了主线。
第一是哈希函数。它把任意长度的数据压缩成固定长度的“指纹”,而且要做到确定性、抗碰撞、雪崩效应。区块链里用它做区块链接、交易指纹、地址生成、工作量证明。比特币用 SHA-256,以太坊用的是 Keccak-256(注意这个跟标准 SHA3 有细微区别,后面我会单独讲),零知识证明领域还出现了 Poseidon 这类面向算术电路的专用哈希。
第二是数字签名。它解决“你是谁”和“这件事是不是你干的”这两个问题。区块链里的每笔交易、每个消息都需要签名,钱包的底层逻辑就是密钥管理和签名计算。绝大多数链使用椭圆曲线签名,比特币和以太坊用 secp256k1,Solana 等新一代链则偏向 Ed25519。签名的安全假设、随机数的生成方式、签名的格式编码,每一个细节都可能成为攻击面。
第三是承诺与隐藏。承诺允许你先把一个值“锁死”在一个串里,事后只打开部分信息,让验证者确认你确实没有中途篡改。这有点像把纸条放进信封再封口:你不打开信封,也能确定里面的内容不会再变。Web3 里的应用很多,比如跨链桥里的资产锁定、Rollup 的状态承诺、隐私场景里的隐秘交易。
第四是证明系统。默克尔证明证明“某个数据存在于某个集合里”,零知识证明则更进一步——在不暴露数据本身的前提下证明“我知道某个数据且它满足某个规则”。Rollup 靠它将成千上万笔交易压缩成一个极简的证明,隐私方案靠它隐藏交易金额和接收方。
这四类密码学工具环环相扣,构成了 Web3 从底层共识到上层应用的全套信任体系。下面逐步拆开讲,我先从最基础也最容易踩坑的哈希和签名开始。
2. 绕不开的基础设施:哈希、签名与椭圆曲线
2.1 哈希函数:为什么区块链只认这么几种
哈希函数是整个区块链的“胶水”。区块之间通过哈希首尾相连,交易内容通过哈希生成唯一摘要,地址本质上是公钥的哈希再加校验位。理解哈希并不难,真正麻烦的是选型:为什么比特币不用 MD5?为什么以太坊用的“SHA3”和 OpenSSL 里的 SHA3 对不上?
原因有一层一层。MD5 和 SHA-1 早就被找到碰撞攻击,直接出局。SHA-256 虽然目前仍然安全,但在零知识证明的电路里,它的计算是天文数字级别,所以出现了新一代面向电路的哈希。最重要的坑发生在以太坊上:以太坊选型时用的是 Keccak 的原始规范,后来 NIST 在标准化 SHA3 时修改了填充字节,导致“标准 SHA3-256”和“以太坊的 Keccak-256”对同一个输入产生完全不同的结果。如果你用 Python 的hashlib.sha3_256去算以太坊地址,永远对不上。正确做法是用专门的 Keccak 实现,比如eth_hash或pycryptodome里的keccak。
哈希在 Web3 里的使用场景还可以再细拆一层。第一是防篡改,任何一位数据的改变都会让哈希面目全非。第二是工作证明,比特币里矿工不断改 nonce 让区块哈希满足某种难度条件,本质是在暴力搜索一个满足前缀约束的哈希值。第三是地址生成,以太坊地址是把公钥做 Keccak 哈希后取后 20 字节,因此任何公钥碰撞都会直接威胁资产安全,好在 160 位的空间让生日攻击也需要约 2^80 次计算。
实操中有一个细节我建议每个开发者都注意:不要用哈希函数做加密,也不要以为“哈希过就安全”。哈希是单向的,但如果你输入的是低熵值(比如一个简单的密码),别人可以用字典和彩虹表反推。Web3 里最典型的场景是助记词,它不能直接靠“想一个词”来生成,必须通过规范化的随机熵 + BIP39 词表生成 12 或 24 个词,再用 PBKDF2 派生私钥。这个流程里的每步都经过精心设计,任何一个“简化”都是在给自己埋雷。
2.2 数字签名:私钥签名、公钥验签这层逻辑必须吃透
签名是整个 Web3 交互的核心。你在钱包里点“确认”,本质上就是用私钥对一笔交易的哈希做签名;别人拿到签名后,用你的公钥验证,就能确认这笔交易确实是你授权的。这里面的数学是椭圆曲线点乘:私钥是一个随机大整数 d,公钥是椭圆曲线上的一点 P = dG,G 是公开的生成元。给定 d 算出 P 很容易,但给定 P 反推 d 极其困难,这就是椭圆曲线离散对数难题。
以最典型的 ECDSA 为例:对消息哈希 z,选择一个随机数 k,计算 R = kG,取 R 的 x 坐标作为 r,然后计算 s = k^{-1}(z + r·d) mod n。签名结果就是 (r, s)。验证时任何人都可以通过特定公式,用 P 和 z 算出 R 的 x 坐标,和 r 比对即可。这个流程里最容易出问题的就是 k。如果 k 不随机,或者两次签名复用了同一个 k,私钥会被直接算出来。这个问题我在后面会用完整的案例演示,因为它是 CTF 和真实安全事件里最常见的题型之一。
以太坊的 ECDSA 跟比特币比多了一个 v 值,也就是 recovery id。原因是椭圆曲线上每个 x 坐标对应一正一负两个 y 点,只给 r 无法唯一确定 R。有了 v,就能在已知签名的情况下恢复出公钥,进而算出地址。这也是为什么智能合约里的 ecrecover 函数可以只凭签名推出“谁签的”。但这里有一个隐蔽的陷阱:ecrecover 对畸形签名的行为是返回零地址,如果你的合约没有校验“恢复出的地址是否为预期地址”,攻击者可以伪造一笔看似来自零地址的合法操作。这个漏洞在真实合约审计里不止一次出现。
签名 malleability 也是开发者容易忽略的点。同一个消息,同一个私钥,理论上存在多个合法签名(因为 r 和 s 的对称性),如果不做限制,攻击者可以修改签名结果而不影响它的合法性。以太坊通过 EIP-2 强制 s 必须取低半区值来避免这个问题,但你在自己设计跨链桥、消息验证逻辑时仍然要记得做同样的事。
2.3 椭圆曲线选型:secp256k1 与 ed25519 的取舍
接触过几条链的人可能已经注意到,主流链选用的椭圆曲线不太一样。比特币和以太坊使用 secp256k1,Solana 使用 Ed25519,新的 zk Rollup 也偏爱基于不同曲线的友好验证。为什么这些选型如此关键?
secp256k1 的曲线方程是 y² = x³ + 7,定义在一个极大的素数域上,它的系数选得非常简单,没有魔术数字,排除了“参数后门”的质疑,这是它在比特币社区获得信任的重要原因。相比之下,NIST 系列曲线的常数来历不明,虽然目前没有任何证据表明有后门,但加密社区始终对其保持警惕。K-1 曲线没有做任何特殊优化,纯粹靠“简单自然”获得安全可信度,这是一种非常原教旨但极其有效的安全策略。
Ed25519 是另一条路线。它基于 Edwards 曲线,在签名算法上使用 EdDSA,最大的优点是签名过程完全确定性:通过 RFC 6979 风格的规则从私钥和消息推导随机数,而不是依赖系统随机源。这对实际工程是巨大利好,因为“随机数发生器故障导致私钥泄露”这类灾难在 ECDSA 里反复发生,在 Ed25519 里则从设计上杜绝了。它的性能也更好,验证更快,所以很多面向高吞吐的网络选择它。
| 对比维度 | secp256k1 + ECDSA | Ed25519 + EdDSA |
|---|---|---|
| 曲线类型 | Weierstrass 曲线 | Edwards 曲线 |
| 随机数生成 | 依赖安全随机源,或自行实现 RFC 6979 | 算法内确定,靠哈希派生 |
| 签名大小 | 约 65 字节(含 recovery) | 64 字节 |
| 主要应用 | 比特币、以太坊、多数 EVM 链 | Solana、Stellar、部分新链 |
| 常见风险 | nonce 复用、随机源弱 | 实现库必须恒定时间,防侧信道 |
话说回来,选型不是越新越好。对 EVM 生态开发者来说,你几乎没有选择:智能合约需要 ecrecover,地址体系也是基于 secp256k1 的。理解两套方案的原因,更多是为了做跨链互操作和安全审计。假如你要做一个跨链签名方案,就得知道 Ed25519 的签名不含恢复公钥的能力,消息格式也可能不同,直接复用 EVM 的验证逻辑会出错。
3. 从入门到实战:结合 CTF 与安全靶场理解 Web3 密码学
3.1 为什么 CTF 和靶场是学习 Web3 密码学的最佳路径
密码学有个特点:公式看着都懂,一做题就懵。书本上给你讲清楚 RSA 加密、ECDSA 签名原理,但换到一个具体的应用场景里,面对一堆编码、填充、参数格式,没人提示你该从哪里下手。我自己带过不少新人,发现成长最快的一批人几乎都靠做题和打靶场打出来的。最近社区里经常看到“Web3 靶场知攻善防”这类词,说的就是针对 Web3 安全的在线实训环境,里面有各种智能合约漏洞和密码学利用题。类似的还有 CTF 竞赛里的 crypto 题型、专门的安全挑战平台,这些都是把抽象概念变成肌肉记忆的好工具。
为什么做题比看书效果好?因为密码学的关键不是“知道算法”,而是“知道哪里会坏”。你在做题时面对的往往是一些“看似正常但有缺陷”的实现:随机数复用、填充错误、签名校验疏忽、哈希选择不当。你需要自己发现问题、推导攻击路径、写出利用脚本。这个过程和真实安全审计极其接近。而且做完题后你对算法的理解会深一个档次:你会明白为什么随机数这么重要,为什么 0x01 和 0x06 的填充差别会导致整个哈希结果不同。
也有人问蓝桥杯这类竞赛到底值不值得打,密码学能不能作为主攻方向。我的看法是完全可以。蓝桥杯的安全赛道里,密码学是一个稳定出现的题型,而且和其他题型相比,它更依赖数学与算法基础,拉开的分差很大。准备这类比赛的过程,正好把 Web3 里需要的模运算、数论、椭圆曲线基础打得比较扎实。就算你最终去做纯开发,这些底子在审计和 Debug 时也会反复帮到你。
3.2 常见题目类型与解题思路
我把 Web3 相关密码学题目整理成一个速查表,方便你遇到题时对照着定位切入点。
| 题型 | 典型特征 | 关键攻击思路 |
|---|---|---|
| 哈希碰撞/长度扩展 | 知道旧哈希和消息长度 | 对 MD5/SHA-1/SHA-256 类结构做长度扩展攻击,伪造新消息 |
| RSA 基础利用 | 多组公钥、小指数、相近因子 | 共模攻击、低指数开方、费马分解、连分数逼近 d |
| 分组密码模式错误 | CBC/ECB 模式中的可控消息 | CBC 比特翻转、ECB 块重排、填充预言攻击 |
| ECDSA 随机数复用 | 同 r、不同 s | 用两次签名联立方程直接恢复私钥 |
| 签名校验缺陷 | 合约/代码未校验恢复地址 | ecrecover 返回零地址、签名 malleability |
| 随机数预测 | 使用区块哈希/时间戳作为随机源 | 链上数据可预测,构造对应的“随机结果” |
| 零知识证明漏洞 | 电路约束缺失、验证点未检查 | 利用约束系统漏洞构造假证明 |
这些题型里,我认为最重要的是 ECDSA 随机数复用和签名校验缺陷。它们不只是 CTF 题目,而是真实发生过多次的黑客攻击路径。区块链上不断出现私钥泄露事件,很大一部分原因就是钱包或跨链桥在签名时没有正确处理随机数,或者对签名的验证不够严谨。
面对一套密码学题目,我建议你养成固定的排查顺序:先看参数有没有硬编码;再看随机数是否可预测或复用;接着看哈希算法选型是否正确;最后检查签名验证是否完整。这个顺序几乎能覆盖 80% 的题目。
3.3 一个完整案例:从交易签名漏洞到地址碰撞
完整的理论容易让人疲劳,我直接用一个经典案例演示实际操作。假设攻击者拿到了同一个私钥签发的两笔交易,而且钱包在签名时错误地复用了同一个随机数 k。那么这两笔交易会有同一个 r,但 s 不同。通过两笔交易的哈希 z1、z2 和签名 s1、s2,可以直接恢复私钥。
数学推导是这样的。两笔签名分别满足:
s1 = k^{-1}(z1 + r·d) mod n
s2 = k^{-1}(z2 + r·d) mod n
两式相减消掉 r·d 项,得到 s1 - s2 = k^{-1}(z1 - z2) mod n,于是 k = (z1 - z2) / (s1 - s2) mod n。拿到 k 之后,回代第一式就能算出 d = (s1·k - z1) / r mod n。
用 Python 演示就是几行代码的事情:
# 已知同一私钥复用 nonce 的两组签名 n = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 # z1, s1, z2, s2, r 为已知值 k = (z1 - z2) * pow(s1 - s2, -1, n) % n d = (s1 * k - z1) * pow(r, -1, n) % n print("私钥:", hex(d))第一次在靶场里亲手跑通这段代码时,我是非常震撼的——私钥就这么轻飘飘地从一次“低级编码失误”里泄露了。这个案例也让我养成了一个习惯:凡是涉及签名的代码,第一件事就是检查随机数从哪来,是不是每个签名都用独立的安全随机源,或者是否采用了 RFC 6979 确定性签名。别相信任何“临时拼一个随机数”的做法,真实攻击者盯的就是这个点。
4. 进阶:默克尔树、零知识证明与 MPC
4.1 默克尔树:轻节点验证背后的哈希聚合
默克尔树是区块链里最简单的“证明系统”。它的思想是先把所有数据叶节点分别哈希,再把两两相邻的哈希拼起来继续哈希,逐层向上,最终得到一个唯一的根哈希。任何一个人只要拥有根哈希和一条路径上的兄弟节点哈希,就能验证某个数据确实属于这棵树,而不需要下载整棵树的数据。
这个机制解决了一个非常现实的问题:区块链膨胀太快,全节点可以承受全量数据,但手机钱包和轻节点不行。轻节点只需要从可信处拿到区块头里存的默克尔根,再向任意节点索取待验证交易对应的路径证明,就能确认这笔交易是否真实存在于区块中。路径验证的计算量是 O(log n),比起全量验证省了太多。
设计默克尔树的时候有几个细节容易踩坑。第一个是排序问题:比特币的默克尔树不排序,直接按区块中的交易顺序两两配对,没有配对的位置用自身复制一份;而有些系统使用排序树,叶子按哈希排序后再构造,好处是证明具有确定性。第二个是零数据节点的处理,很多实现里零值哈希是固定值,攻击者可以伪造包含零值数据的证明,所以验证时通常需要约定叶子层数量。第三是注意不要混淆“默克尔证明”和“默克尔审计”,前者是证明存在,后者还要证明数量,如果只证明存在而没做数量约束,就会出现“同一数据被重复证明”的问题。
4.2 零知识证明:zkSNARK 与 zkSTARK 的原理与差异
零知识证明是 Web3 密码学里最被高估也最被低估的部分。说被高估,是因为大量营销文章把它形容成“万能隐私神器”,好像有了它一切数据都能被隐藏且可信;说被低估,是因为真正能把它实现落地的人仍然稀缺,它在 Rollup 和隐私场景中的实际价值怎么强调都不过分。
用一个生活化例子来理解它:你买了一张门票去现场,保安要验证你确实有票,但你不想让他看到你的姓名和手机号。经典的零知识证明协议能做到的是——你向保安出示一个密码学证明,他验证后确信“你手里有一张有效票”,但他依然不知道票是谁的。这就是“证明你知道某个秘密,却不泄露秘密本身”。
技术底层的差异决定了选型:
zkSNARK 的典型代表是 Groth16,证明体积小、验证成本极低,非常适合链上验证,但它需要初始化时的“可信设置”——一套公开参数,如果这套参数的生成环节被污染,理论上可以伪造证明。PLONK 等新一代 SNARK 降低了对可信设置的依赖,但复杂度依然存在。zkSTARK 则彻底摆脱了可信设置,它主要靠哈希和多项式承诺,安全性只依赖抗碰撞哈希,还有一个额外的好处是抗量子攻击(至少目前看起来如此),代价是证明体积比 SNARK 大一个量级,链上验证成本更高。
如果只是写业务合约,你可能直接调用现成的验证库,不用操心 Groth16 和 STARK 的实现差异。但如果你在做跨链桥、隐私协议或 Rollup,选型就很关键:需要快速验证就选 SNARK 类方案;需要透明信任模型就选 STARK;如果项目对证明尺寸特别敏感,那 Groth16 类方案仍然是主流选择。我个人的经验是,刚开始接触时不用死磕底层多项式数学,先理解清楚“算术电路 → 多项式承诺 → 验证”这条逻辑链,再在具体项目里补细节。
这里再多说一句:零知识证明不是银弹。电路约束如果写得不完整,证明者可以利用未被约束的输入做手脚,这类漏洞在真实系统里出现过。所以拿现成电路库时,一定要做额外的约束审计,而不是默认“用了 zk 就安全”。
4.3 多签与 MPC:门限密码学在钱包中的应用
普通的单私钥钱包存在一个天然弱点:私钥一旦丢失或者被钓鱼,资产就没了。多签和 MPC 的意义在于分散风险。多签是把“是否允许转账”的权限分散到多个地址上,链上合约规定至少 m 个地址中的 n 个签名才能放行。MPC 则更进一步,它通过门限签名技术,把一把私钥切片分发到多个设备,每台设备只持有私钥分片,但多台设备可以共同完成一次签名,过程中任何一台都无法单独恢复私钥。
MPC 底层的知识之一是 Shamir 秘密分享。它的数学模型基于拉格朗日插值:任意 t-1 次多项式可以由 t 个点完全确定,所以你可以把秘密作为多项式的常数项,给 n 个人各发一个点,任何人凑齐 t 个点就能恢复秘密,少于 t 个则什么都得不到。这样门限的选择就是安全与便利之间的权衡:门槛低,容易凑够签名;门槛高,单点风险更小。
实际操作中,MPC 钱包对客户端的随机数质量要求极高,因为生成分片和签名的每一步都涉及随机多项式。如果某个分片设备被植入恶意代码,它可能在期间试图收集足够多的信息来恢复私钥。所以大厂和机构使用 MPC 时通常搭配硬件安全模块。对于个人开发者,我建议先通过开源库学习和模拟,别在没有审计的情况下自己实现门限签名,密码学最大的特点是你根本不知道自己哪里做错了,直到出事故。
5. 避坑指南:学习路线、工具选型与常见错误
5.1 学习路线:教材、课程与实操平台怎么搭
经常有人问我 Web3 密码学应该怎么学,要不要从《现代密码学》(杨波)和《应用密码学》开始啃。我的回答是书要看,但不能只有书。杨波的教材胜在系统性强,从古典密码到公钥密码,再到数字签名和协议分析,能够帮你建立完整框架;《应用密码学》更偏向密码学协议的真实应用和攻击历史,适合带着实际场景去翻。但纯粹看书会让你陷入“每个字都认识,题目全做不出”的困境。
我推荐的路线分四步走。第一步,把数学基础补起来:模运算、有限域、椭圆曲线点群,这一层不需要太深,能理解“大数离散对数为什么难”就够了。第二步,用代码复现核心算法:手写一个 ECDSA 签名与验证、算出一个以太坊地址、实现一个默克尔树。第三步,上手做题:CTF crypto 从简单题开始,Web3 靶场里有针对性的智能合约安全题,蓝桥杯安全赛道也是很好的练兵场。第四步,阅读真实审计报告和漏洞披露,把知识应用到“为什么这里会被攻击”。
工具方面,我常用的有 Python 的 cryptography 库、pycryptodome、eth_account、web3.py,以及专门做椭圆曲线运算的 coincurve。用这些库的时候建议先读它们的底层实现文档,否则很容易用错 API。比如eth_account的sign_transaction和我们自己实现的 ECDSA 有什么区别,理解了才好在跨链或自建签名服务时做正确适配。
5.2 实操中的高频坑:随机数、编码、参数校验
实操经验里我踩过不少坑,挑几个最典型的列出来,每一个都值得你记一下。
第一是 Keccak-256 与 SHA3-256 混淆。前面提过以太坊用的是原始 Keccak,和 NIST SHA3 不兼容。我在帮别人排查地址错误时,经常发现对方用标准库算地址,导致签名对象哈希错误。这个坑属于“一次错,全线崩”,因为键对和地址不匹配,交易根本无法上链,而且问题非常隐蔽。
第二是随机数与 nonce 管理。ECDSA 对随机数的要求不是“看起来随机”而是“不可预测且不复用”。很多初级代码喜欢用时间戳当随机数,或通过random库生成,这在密码学上等于自杀。正确做法是使用密码学安全随机源,或者直接用 RFC 6979 确定性签名,让 k 由私钥和消息哈希共同推导。
第三是地址校验和。EIP-55 规定了以太坊地址的大小写混合校验和,如果你在业务里手动处理地址而不做校验,用户输入一个全小写或全大写的地址时,任何一位字母的错误都无法被发现。这会导致资金打到不可控的地址上。很多加密钱包已经默认帮你处理了,但如果你在自己做转账合约、后台系统或批量归集工具,这个校验一定要自己加上。
第四是签名的格式与范围。以太坊的签名是 r(32字节)+ s(32字节)+ v(1字节),但有些链或跨链协议会使用不同编码。跨链桥审计时经常发现签名验证逻辑只认某一种格式,导致另一条链的合法签名在这里被拒,或者反过来被恶意利用。还有 s 值必须限制在低半区,防止 malleability 攻击。
第五是智能合约里的“随机数”问题。不少合约把区块哈希或者block.timestamp当作随机源,供给游戏抽奖或 NFT 盲盒,但链上数据对矿工和验证者是可见且可预测的。攻击者可以等到区块哈希确定后再决定是否参与,从而操纵结果。正确方案是用 Chainlink VRF 这类链下可验证随机数服务,或者引入承诺-揭晓机制。
这些坑有一个共同点:问题不在算法本身,而在算法被“错误地使用”。密码学安全不是说用了 AES 或 ECDSA 就安全,而是说“在正确的模式、正确的参数、正确的边界条件下使用”才安全。
5.3 密码学在 Web3 中的边界与风险
最后我想讲讲边界。密码学解决的是数学上的“可知与不可知”,但它不能替你做物理安全、不能替你守住助记词、不能在你手机被植入木马后救你。私钥一旦被恶意软件读取,签名算法再强也无济于事。所以 Web3 的完整安全模型是密码学 + 密钥管理 + 供应链安全 + 人员流程管理的叠加。
另一个值得关注的风险是量子计算。当前主流椭圆曲线签名在理论上可以被足够的量子比特攻破,虽然距离工程实现还有很长的路,但已经有一些项目开始采用抗量子签名方案,比如基于哈希的 Lamport 签名、基于格的签名等。我个人的判断是短期内不必焦虑,但如果你是做长期资产托管或跨链协议,设计上最好预留算法升级的通道,免得未来被迫硬分叉。
作为工程师,最务实的建议是:用标准库,用经过审计的库,用经过时间考验的方案,别自己发明密码学。密码学领域有句老话:别自己造密码。Web3 里这句话尤其成立,因为每一行代码都直接和资产安全挂钩。你需要关心的不是“这个公式有多美”,而是“这个协议在攻击者眼里哪里有可钻的缝隙”。
回想我自己从看书到做题到审计合约的那段路,有个体会一直很深刻:光看书永远学不会密码学,我第一次真正理解 nonce 复用,是在靶场里亲手算出了私钥的那个瞬间。那比任何教科书章节都刻骨铭心。所以最后分享一个最小可行练习:试着不用现成签名库,用 Keccak 和椭圆曲线运算手写一笔以太坊交易签名并完成验证。这个过程会很痛苦,但你会把哈希、编码、签名、校验全部打通。做完它,再看 zk、MPC、跨链消息验证,都会轻松很多。Web3 密码学是一座很深的矿,往里挖的人不少,真正挖到东西的不多,希望你成为后者。