题目
有合作方要求你接入一个「对 32 字节哈希签名」的老接口,理由是他们的合约里就是用 ecrecover 直接校验的。你的钱包测试却发现主流钱包都拒绝了这个请求。
请说明这类请求的风险在哪里,以及正确的替代做法是什么。
考察目标
- 是否理解「对任意摘要签名」会让用户失去对签名用途的判断。
- 能否说清带前缀签名如何降低风险。
- 能否给出可迁移到链上校验的替代方案。
考察对任意摘要签名的风险,以及它与带前缀签名的安全差别。
有合作方要求你接入一个「对 32 字节哈希签名」的老接口,理由是他们的合约里就是用 ecrecover 直接校验的。你的钱包测试却发现主流钱包都拒绝了这个请求。
请说明这类请求的风险在哪里,以及正确的替代做法是什么。
对裸摘要签名时用户看不到内容与用途;EIP-191 用 0x19 前缀让签名数据不构成合法 RLP,并用版本字节区分不同签名用途,因此带前缀的消息签名或 EIP-712 结构化签名可以在链上按对应格式校验。
0x19 的引入让签名数据不构成完整 RLP 结构,从而无法作为以太坊交易使用(依据:EIP-191 §Specification)。0x45)、结构化数据签名(0x01)、带预期验证者的签名(0x00)区分开,避免一类签名被搬到另一类场景(依据:EIP-191 §Specification 的 Registry of version bytes)。verifyingContract,用户代理可以据此做合约级防钓鱼;域中链标识与当前链不一致时宜拒绝签名(依据:EIP-712 §Specification 的 domainSeparator)。eth_sign 标注为已弃用,推荐的替代是 eth_signTypedData_v4 与 personal_sign(依据:MetaMask 文档:Sign data)。0x00 设计用于把预期验证者纳入签名内容;依据:EIP-191 §Specification 的 Registry of version bytes)。发现这道题有问题? 反馈此题