钱包签名的风险:授权、转账与盲签
每次钱包弹出一个签名请求,绝大多数人的操作是一样的:扫一眼,看不太懂,反正想把这一步走完,点确认。问题就在这儿——签名这个动作,含金量天差地别。有的签名只是证明“你是这个钱包的主人”,签了无伤大雅;有的签名却等价于把动用你资产的权限交出去,签下去和打开保险柜没区别。它们弹出来的样子有时很像,都不花 gas、都让你点个确认,但后果完全是两回事。
这篇我们把钱包里几种常见的签名一个个拆开:哪些只是身份证明,哪些会真正动到钱,permit 这种离线签名为什么比普通授权更阴,eth_sign 盲签为什么看到就该关掉,以及最实用的——怎么在点确认之前看懂那行字到底在问你要什么。技术会讲准,但都翻译成人话。读完你不用变成开发者,但应该能在弹窗前停下来,分清这次是“证明我是我”还是“把权限给出去”。授权这件事本身的完整操作,可以配合钱包授权检查与撤销一起看。
钱包里几种常见的签名
先建立一个粗略的地图。你在用钱包时遇到的请求,大致分成两大类,理解这个分界是后面一切的基础。
- 交易(transaction)。会真正改变链上状态、需要付 gas、必须打包上链。普通转账、approve 授权、和合约交互(换币、mint 等)都属于这类。它的特征是:要花手续费,钱包通常会显示这笔交易要做什么、动多少。
- 签名(signature / 消息签名)。用你的私钥对一段数据做密码学签名,本身不一定上链、通常不花 gas。它可能只是证明身份(比如登录某个 DApp),也可能是一份“授权书”被对方拿去链上使用(比如 permit),还可能是看不懂含义的原始数据(eth_sign 盲签)。
很多人危险的误解就藏在第二类里——“反正不花 gas、又不是转账,签个名能有什么事”。恰恰相反,最隐蔽的链上钓鱼,靠的就是让你签一个看似无害的消息。签名背后的密码学基础,以及以太坊上交易与签名的关系,以太坊基金会的交易文档讲得比较系统,想打底子可以看。
一个朴素但重要的判断起点:花不花 gas,不等于危不危险。真正决定风险的是“这次签名/交易把什么权限或资产交了出去”。下面几节就按这个标准,把常见的几种逐个评估。
普通转账签名:方向是币流出
最好理解的是普通转账。你要把一些币从自己地址转给另一个地址,钱包弹出一笔交易,让你确认收款地址、转账数量、以及大致的 gas。你签名确认后,这笔交易上链,币就转走了。
这类的风险点相对直白,主要是两个:一是收款地址错了或被替换——粘贴时被剪贴板劫持软件换成了攻击者地址、或者你抄错了几位;二是转错数量。它不像授权那样把“长期权限”交出去,损失通常一次性、范围限于你这次转的那笔。但因为是直接转钱,错了就追不回,所以转账前核对地址尤其重要。本站的地址校验工具可以帮你确认地址格式没问题、没抄错;养成“转账前对一遍收款地址前后几位”的习惯也很值。
记住这类的一个特征:方向是“币从你这里流出”,且数量、对象都明明白白写在弹窗里。这反而是相对透明的一种——你看到的就是会发生的。真正阴的是后面那些“看起来不像在动钱”的签名。
合约交互签名:你在调用一个函数
当你在一个 DApp 上做点什么——在 DEX 换币、给流动性池加钱、mint 一个 NFT——你发起的其实是“调用某个合约的某个函数”的交易。钱包会弹出来让你确认,这也属于要付 gas 的交易类。
这类签名的风险在于,你未必看得懂自己在调用什么。规范的钱包会尽量把交易“解码”成人话,告诉你这是在和哪个合约交互、大概要做什么、可能动用哪些代币;但如果合约没被验证、或交互复杂,钱包可能只显示一串看不懂的数据。智能合约是什么、为什么交互前最好确认合约可信,以太坊基金会的智能合约文档有基础说明。
合约交互前,先确认你交互的合约地址是项目官方公开的那个,而不是从私信、广告点进去的页面塞给你的地址。同一个动作(比如换币),在真官网发起和在仿冒站发起,调用的合约可能完全不同——后者就是钓鱼。从书签进官网,是成本最低的防护。
合约交互里,最需要单独拎出来讲的一种,就是 approve 授权,因为它是钓鱼最常借用的形态。下一节专门说。
approve 授权签名:把动币的权限交出去
approve 是一种特殊的合约交互:你不是在转币,而是在告诉某个代币合约“我允许某个地址(spender),最多从我名下转走 N 个这种代币”。这个 N 叫授权额度(allowance)。授权之后,在额度用尽前,那个被授权的合约不需要你再签名就能反复把你这种代币转走。这是 DeFi 自动运转的基础机制,本身没问题。
它的危险有两层。第一,很多 DApp 默认申请的 N 是接近无限的极大数(无限额度授权),图省事,但意味着这个合约一旦是恶意的、或日后被攻破,就能把你这种代币全部转走。第二,钓鱼页会把“领空投”伪装成一笔对它自己合约的 approve——你以为在领币,实际在给骗子的地址开掏空你某种代币的长期权限。
关于 approve 的完整机制、无限额度的隐患、以及怎么查看和撤销已经开出去的授权,本站钱包授权检查与撤销那篇讲得很细,这里只强调一个判断:“领取”这个动作如果要你 approve、要你把动币权限交出去,方向就反了。正常领取是币流向你、你自己付 gas 领;授权钓鱼是权限流向它。方向反了,就是红灯。撤销已开授权认准官方工具 revoke.cash。
permit(EIP-2612)离线签名为什么危险
到这里要讲全文最关键的一种——permit。它危险,恰恰因为它“看起来太无害”。
先说它本意。以太坊有个改进提案叫 EIP-2612,给 ERC-20 加了 permit 功能,让授权可以通过一个离线签名完成,而不必单独发一笔花 gas 的 approve 交易。也就是说:你签一份结构化的消息(不上链、不花 gas),对方拿着这个签名,就能去链上替你完成等价于 approve 的授权。设计目的是省一笔交易、省 gas、改善体验。这套结构化签名的格式基于另一个提案 EIP-712,让签名内容能以相对可读的字段展示。两个提案的原文分别在 EIP-2612 和 EIP-712。
危险点在于:对普通用户来说,签一个 permit 消息和签一个普通登录消息,弹窗看着差不多,都不花 gas、都只是“点个确认”。骗子把钓鱼页写成“签名验证你的空投资格”“签名以登录”,你以为只是证明自己是钱包主人,实际签下的是一份 permit——授权对方动你的某种代币。签完页面可能毫无变化,等你发现时,对方已经拿你的签名在链上完成授权并把资产转走了。
permit 比普通 approve 钓鱼更阴,原因有三:它不花 gas,绕过了“要付费、要二次确认”的心理门槛;它不上链(你签的那一刻),你在自己的交易记录里一时看不到痕迹;它的弹窗如果钱包解析不到位,很容易和普通签名混为一谈。这也是为什么近年来很多针对散户的链上盗取,走的都是签名而不是直接骗私钥。
看到“签名”里出现 Permit、spender(被授权方)、value(额度)、deadline(有效期)这类字段,就要高度警觉——这极可能是一份等价于授权的离线签名,不是单纯的登录证明。尤其当它出现在“领空投 / 验证资格”的语境里,先停手。
eth_sign 盲签:最该警惕的弹窗
还有一种更原始、也更危险的请求:eth_sign。它能让你签署一段看不出含义的原始数据(通常是一串十六进制哈希),钱包没法把它翻译成人话告诉你这签的到底是什么。这就是俗称的“盲签”。
问题在于,这段看不懂的数据,理论上可以是任何东西——一笔授权、一笔转账、一个 permit。你签了,就等于在一份内容空白、却具备法律效力的文件上盖了章,对方填什么是什么。正经 DApp 极少要求 eth_sign,正因为它太危险,主流钱包(如 MetaMask)默认会对这种请求弹出醒目的警告,甚至默认禁用。各类签名方法的风险与钱包的处理方式,以你所用钱包的官方文档为准,例如 MetaMask 支持中心有专门说明。
看到钱包提示“这是一个 eth_sign 请求”“无法解析的原始签名”“签名内容无法显示”这类红色警告,直接关掉,别签。除非你百分百清楚自己在做什么,否则盲签没有任何应当配合的理由。一个让你盲签的页面,本身就值得怀疑。
把前面几种放在一起对比,方便你在弹窗前快速归类:
| 类型 | 本质在做什么 | 花 gas 吗 | 风险高低 |
|---|---|---|---|
| 普通转账 | 把币转给某地址 | 是 | 中:核对地址、数量即可 |
| 合约交互 | 调用某合约的函数 | 是 | 看交互内容,需确认合约可信 |
| approve 授权 | 给某地址开动币额度 | 是 | 高:尤其无限额度 + 陌生对象 |
| permit 离线签名 | 用签名等价开授权 | 否 | 高:看似登录,实为授权 |
| eth_sign 盲签 | 签看不懂的原始数据 | 否 | 极高:内容不可见,默认拒签 |
怎么看懂一个签名请求
把上面的知识落到弹窗前的几秒钟,这是我们自己每次签名前会走的一遍念头。它不保证识破一切,但能挡掉绝大多数。
- 先问“这一步我以为在干嘛”。你点的按钮写的是“登录 / 连接 / 领取 / 换币”?把你的预期记在心里,待会儿和弹窗内容对一遍。
- 看是交易还是签名。有 gas、有“确认交易”字样的是交易;没 gas、只让你“签名”的是消息签名。后者更要看内容,别因为不花钱就放松。
- 读关键字段。出现
Permit、spender、value、approve、setApprovalForAll这类词,意味着你在交出权限,不是单纯证明身份。出现eth_sign/ “原始数据” / “无法显示内容”,直接拒。 - 对一对方向。你以为在“领取 / 登录”,弹窗却在“授权 / permit”——预期和内容对不上,就是危险信号。
- 核对授权对象。如果确实是授权,看清 spender 是不是你信任的正规合约,必要时拿地址去区块浏览器(如 Etherscan)查一下来历。
- 对不上就拒签。拒签几乎没有代价——大不了这次操作不做。点确认才是不可逆的。宁可多拒几次,别赌一次。
核心其实就一句话:钱包能用人话清楚告诉你“你正在把 X 权限给 Y”,且这正是你想做的事,才签;只要内容含糊、或和你以为的操作对不上,就拒。规范的钱包会尽量帮你把内容解析出来,所以用维护良好、解析能力强的主流钱包本身也是一层防护,钱包安全设置请以其官方文档为准(例如 MetaMask 支持中心)。
就算你不慎签了一份 permit 或开了一笔 approve,也不是无解——只要私钥、助记词没泄露,对方能动的只是你授权过的那种代币,且你可以去撤销授权止损。完整的撤销步骤在钱包授权检查与撤销。但盲签和助记词泄露是另一回事,那种情况严重得多。
养成的安全习惯
把零散的判断变成肌肉记忆,下面几条我们自己一直在用。
签名前停三秒,念一遍“它要动我什么”
骗局几乎都靠制造紧迫感让你来不及想。反过来,强迫自己在每次点确认前停三秒,把弹窗里的关键字段念出来——是登录,还是授权?方向对不对?这个小动作能拦下大多数“想都没想就点了”的事故。
分钱包:让试水钱包替你挨刀
把长期资产放在一个几乎不连 DApp 的“金库钱包”(最好配硬件钱包),另开一个只放少量资金的“试水钱包”专门连各种新站、领空投、签各种名。即便试水钱包某次签错了,损失也封顶在那点钱里。这是性价比最高的一条防线。配套的私钥助记词保管,见助记词安全。
从书签进官网,别现搜
很多危险签名的源头是一个仿冒站。把常用项目官网、常用工具存成书签,每次从书签进,从入口避开假站。识别假空投、假领取页的更多套路,见防假空投与授权钓鱼。
定期撤销,把签出去的权限收回来
签名(尤其 approve、permit 生效后的授权)会累积。养成定期用 revoke.cash 检查并撤销不用的授权的习惯,把早就忘了的旧权限收回来。先搞清 Web3 钱包的基本盘也有帮助,见什么是 Web3 钱包;想边查边核风险,可用本站授权风险自查当对照清单。
我们后来给自己定了个死规矩:凡是“领空投 / 验证资格”时弹出来要签名的,先默认它是 permit、是授权,按最坏情况对待,看清楚字段再决定。这条规矩让我们拒掉过不少签名,事后回看,那些拒掉的多半真有问题。
收尾。钱包签名不是一个动作,是一类动作,从“证明我是我”到“把保险柜钥匙交出去”都有。把它们分清楚——交易看清地址数量,授权看清对象和额度,permit 当成隐形授权来防,eth_sign 盲签一律拒——再配上停三秒、分钱包、从书签进、定期撤销这几条习惯,你就能在那个看似随手的“点确认”面前,真正知道自己在签什么。