剪贴板劫持与地址替换:发币前怎么核对地址
校验和只能挡住手滑,挡不住替换。我们实测了 1,304 个改动过的比特币地址、5,415 个改动过的门罗地址,然后写下真正管用的那套核对动作。
剪贴板不是私有通道。几乎所有桌面系统里它都是一块共享缓冲区——任何以你的账号运行的程序都能读、能覆盖,没有弹窗,也没有记录。剪贴板劫持要的就是这一点:盯着像加密地址的字符串,在你复制的那一刻换成自己的。你粘贴、地址格式完全正确、钱包照收、钱就走了。这不是假想的格式问题——链上可供模仿的地址格式有一大把。2026 年 10 月 24 日 17:47:02 UTC 出块的比特币区块 972,954 里,660 个可花费输出分成五种形态:409 个 42 字符的 P2WPKH、143 个 34 字符的 P2PKH、46 个 34 字符的 P2SH、44 个 62 字符的 P2TR、18 个 62 字符的 P2WSH。劫持者只要看清你复制内容的前四个字符,就知道该还你哪一种。
校验和正是这件事让人误以为安全的原因。我们从这个区块里取了一个真地址 bc1q5js6zn25fwvr0zhm537ytt30f2d2fjzuh7gs6n,在它的 42 个位置上逐个替换成 bech32 字母表里的其它字符,跑了 1,304 个变体:0 个通过。又拿一个 95 字符的门罗地址(4 字节 Keccak 校验和)做同样的事,5,415 个单字符变体,0 个通过。Base58Check 同理:把 1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa 改一个字符,双重 SHA256 校验不过;把 TRON 上的 USDT 合约地址 TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t 改一个字符也不过——这个地址解码出来是 0x41 网络字节加 20 字节,尾巴 4 字节就是校验和。所以单字符的手滑基本不可能漏过去。问题在于:劫持者从来不会手滑。它给你的是一串「另外生成的、校验和完全正确」的地址。 (XMR 换 USDT 退出路线)
流水线上的校验到这里就到头了。我们自己下单接口的服务端校验只是一条长度上限——256 字符,别的没有——格式和校验和是往下一层、由流动性方做的。两条拒绝路径都真实存在,今天我们都触发了:把一个 95 字符的门罗地址改一个字符,上游回「… is not valid. Reason: Invalid checksum」;传个「test」,回「invalid destination address」。这能挡住粘了一半的地址,挡不住粘对了的地址。EVM 链更弱,因为以太坊地址根本没有强制校验和。EIP-55 只是把校验和编码进大小写,而且只有你使用混合大小写形式时才生效:我们把 0xdAC17F958D2ee523a2206206994597C13D831ec7 重算了一遍 EIP-55,结果一致;但同一个地址写成全小写、或者改掉一个十六进制字符后仍全小写,任何钱包都照收。ETH 和 USDT-ERC20 上,手滑只有你的眼睛能发现。 (XMR 换 USDT 退出路线)
干替换的有四个面,剪贴板只是其中之一。宿主层恶意程序读缓冲区、匹配模式、写回去。恶意浏览器扩展连剪贴板都不用碰——你粘贴完之后它直接改写输入框里的值。几年前从钓鱼页存下的地址会一直有效,因为地址簿默认被信任,几乎没人复查。二维码覆盖则是摄像头看到一个码、屏幕上渲染另一个码。把这四者串起来的是同一个动作习惯:粘贴、瞄一眼、发送——而「瞄一眼」正是最弱的一环。一个 34 字符的比特币地址,只比对前四位和后四位,等于只核了 34 个字符里的 8 个,约四分之一,而且是在那块可能已经被做过手脚的屏幕上核的。
真正管用的核对很无聊,大约 30 秒:在一台不是你发送用的设备上,把整串地址逐字符比一遍。用硬件钱包签名,那台设备会在签名时把自己的屏幕亮出来显示目标地址——那个画面是固件画的,不是你的操作系统画的,也是被入侵的宿主唯一改不了的一处。如果是付一笔兑换单或交易所,目标地址在你手机上:打开收款钱包、点收款、对着桌面屏幕读。二维码完全绕开剪贴板,等于砍掉一整类攻击面——但要从收款钱包自己的屏幕上扫,而且扫完仍要读一遍码下面印的地址文字,因为二维码替换是真实存在的手法。地址这样核过一次之后,存进钱包地址簿,以后只用保存的那一条;从聊天记录里重新复制,就是第二次翻车的标准路径。
广播之后这些都救不回来,所以发送前那一次核对才是唯一有意义的核对。比特币交易只有在签名时勾了 RBF 才可能被替换,而兑换入金几乎没人勾;门罗、TRON、以太坊的转账一旦确认就是终局。在兑换单上,你负责的地址不止收款地址——退款地址是另一个,它失败的机制一模一样:退款地址被换掉,一笔失败的订单就变成了捐赠。有一个不对称值得记住:订单页上的充值地址是流动性方按单现生成的,配着自己的二维码,完全不经过你的剪贴板,劫持者没有可换的目标。你要负责的,始终是你自己敲进去或粘进去的那两个:收款和退款。 (转错网络如何找回)
很多人第一反应是「先发一小笔试一下」,对自持钱包来说这笔账算得通。按今天的行情,141 vB 的比特币交易在 1 sat/vB 下是 141 聪,BTC 80,255 美元时约 0.11 美元。门罗 1 进 2 出是 1,534 字节,按 20,000 piconero/字节的下限算是 0.00003068 XMR,不到两美分。USDT-TRC20 转账是 64,285 能量(6.4285 TRX)加 345 字节带宽(0.345 TRX),TRX 0.3295 时约 2.23 美元。真正不成立的是拿兑换单去试。USDT-TRC20 换 XMR 现在的下限是 19.741234 USDT,把实时报价拟合一下——100 换 0.14558008、5,000 换 8.18028676——得到边际价 609.85 USDT 兑 1 XMR、每单固定成本约 11.22 美元。按下限走,这 11.22 美元占你发出金额的 56.8%。要试就用自持钱包转一笔去试,别拿兑换单试。 (XMR 换 USDT 退出路线)
诚实的边界在这里:如果你正在敲字的那台机器在内核层被拿下,那么在这台机器上做的任何核对都没有意义——钱包显示的地址、区块浏览器、二维码,全都不算。这正是这套动作要围绕「第二台设备」而不是围绕软件来设计的原因。真正能扛住恶意程序的习惯都很小:不要让剪贴板承载一个你没逐字符核过的地址;维护一份已验证的地址簿,别再反复从聊天里复制;任何刚粘进来的地址都当不可信处理,哪怕上周用的就是它——因为那恰恰是劫持者会改的地方。凡是你丢了会心疼的金额,就在硬件钱包屏幕或手机上,把地址念出来核对一遍,再按发送。这些都不高深,它们的全部价值,就是拿 30 秒换掉一笔谁也帮不了你的转账。