重放攻击的核心,不是伪造签名,而是重复利用一份原本合法的已签名消息。攻击者把这份消息再次广播到可接受它的链或应用里,系统若缺少校验,就可能把同一笔交易当成新的有效操作处理,导致用户在不知情的情况下重复转账或重复执行指令。
这类风险常见于区块链分叉,或两条链采用相近格式、验证边界又不清晰的时候。因为签名本身没有被修改,另一套系统可能仍会接受它。结果就是,一笔交易可能在一条链上成立,也在另一条链上被再次执行。文章提到,2016 年 Ethereum 与 Ethereum Classic 分叉后,由于早期缺少足够的重放保护,攻击者曾在两个网络间重复交易,用户因此承担了重复支付的损失。
钱包先做限制:让签名只对应一条链
钱包拦截重放攻击,常见方法之一是把chain ID写入签名上下文。这样一来,这个签名只对特定区块链有效,换到别的链就无法通过验证。对跨链频繁切换的用户来说,这种机制很关键,能直接缩小签名被“搬运”到其他网络的空间。
另一道常用防线是nonce。每发起一笔交易,nonce 都会递增;如果同一个 nonce 被再次使用,钱包或系统就会拒绝处理。这不是复杂设计,却很有效。攻击者即便拿到了旧消息,也难以把它再包装成一笔全新的有效交易。
时间限制和消息域隔离也在发挥作用
部分钱包还会给签名消息加上有效期。文中举例称,某条消息可能只在5 分钟内有效,时间一过,签名就失效,重放窗口随之关闭。这个做法尤其适合支付确认或短时授权场景,可以减少旧消息长期暴露在外的风险。
在链下签名场景,应用通常会采用EIP-712 标准,把 chain ID、应用名称和合约信息一并写入消息结构。这样,签名不仅和某条链绑定,也和特定应用、特定合约绑定。区块链安全公司 QuillAudits 提醒,链下授权如果忽略这类 domain separation(域隔离),攻击者就可能利用跨系统兼容性滥用签名。
仅靠钱包不够,合约和应用也要拒绝重复消息
文章指出,智能合约和应用本身也需要做重放防护,常见方式是为每个用户设置 nonce 或计数器,在合约层面记录已使用过的签名。一旦同一条消息被再次提交,合约可以直接拒绝执行。这样做能把防线从钱包端延伸到协议端,减少单点失守带来的风险。
交易所和托管机构同样会把重放保护用于充币、提币等操作,只允许交易在正确网络上被接受。对用户而言,使用可信钱包、经过验证的 dApp,以及完成审计的智能合约,能降低遭遇重放攻击的概率。文章给出的结论很明确:chain ID、nonce、过期时间与 EIP-712 等机制叠加使用,仍是当前防止签名被重复滥用的主要做法。

