一句话版本
用户常被教导"签名前核对网页和钱包弹窗上的地址是否一致"。但如果网页被篡改,攻击者会让两边同时显示他的地址,一致性检查毫无意义。 真正可靠的核对必须走另一条通道:打电话问本人、当面扫码、用另一台设备查看。只要攻击者不能同时控制两条通道,就无法让两边都撒谎。这叫带外核对(out-of-band verification)。
全文分三层:
- 通俗理解:骗子发来的电话号码不能用来核实骗子
- 实际用处:商业邮件诈骗、银行回拨、Signal 安全码、硬件钱包
- 原理与工程要点:通道独立性、核对什么、怎么在产品里引导
第一层:通俗理解
1.1 用骗子给的号码核实骗子
财务收到一封"供应商"的邮件:我们换了银行账户,以后请付款到这个新账户。邮件末尾写着:"如有疑问,请拨打 xxx 核实。"
财务很谨慎,打了这个电话,对方确认了。于是付款。
问题在于:电话号码是骗子在同一封邮件里给的。核对和被核对的信息来自同一个通道,攻击者控制了这个通道,就同时控制了"问题"和"答案"。
正确做法是:用以前就有的、不是这封邮件提供的电话号码,打给供应商。
1.2 网页和钱包为什么不是两条通道
| 你以为的 | 实际上 |
|---|---|
| 网页显示一个地址,钱包弹窗显示一个地址,两边都核对了 | 钱包弹窗里的地址就是网页传给钱包的。网页被篡改,钱包显示的也是篡改后的地址 |
钱包能保证"签的就是弹窗里显示的",但不能保证"弹窗里显示的就是你想要的"。
第二层:实际用处
- 商业邮件诈骗(BEC):美国 FBI 网络犯罪投诉中心每年的报告里,BEC 都是损失金额最大的犯罪类型之一,每年数十亿美元。几乎所有企业财务的标准防御都是:变更收款账户必须通过已知电话回拨确认。
- 银行的回拨核实:大额或异常转账时,银行会打你在银行登记过的号码,而不是你在交易中留的号码。
- Signal / WhatsApp 安全码:防中间人的最终手段是两个人当面或通过另一个渠道比对安全码(见《TOFU与公钥钉扎》)。Telegram 通话时双方屏幕上显示的几个表情符号也是同样的设计:双方在通话里互相念一遍,一致就说明没有中间人。
- 硬件钱包:屏幕独立于电脑,是一条"带外"的显示通道。前提是它能把交易完整解码显示出来,否则就退化成盲签(见《盲签与所见即所签》、Bybit事件与前端完整性)。
- 加密货币转账:首次转账或大额转账前,通过另一个渠道(电话、当面、另一个聊天软件)向收款人核对地址的开头和结尾若干位。
Caloogy Wallet 也采用了带外核对提示。
第三层:原理与工程要点
3.1 通道独立性
两条通道"独立"的标准是:攻击者攻破一条,不会自动攻破另一条。
| 组合 | 独立吗 |
|---|---|
| 邮件 + 邮件里给的电话 | 否 |
| 网页 + 网页唤起的钱包弹窗 | 否 |
| 电脑网页 + 手机上的另一个应用 | 基本是(除非两台设备同时被控制) |
| 电脑 + 硬件钱包屏幕 | 是(前提是硬件钱包能完整解码) |
| 线上消息 + 当面或电话 | 是 |
3.2 核对什么
- 核对完整信息的足够多位数:地址至少核对开头和结尾各若干位,越多越好(只核对首尾 4 位挡不住地址投毒,见《地址投毒》);
- 核对来源可信的参照物:对方本人口述、你自己保存的记录,而不是对方刚发来的消息;
- 核对的方向:让对方说出来、你来比对,而不是你念出来、对方说"对"(对方可能根本没听清就答"对")。
3.3 在产品里引导
产品无法替用户完成带外核对,但可以:
- 在首次转账、大额转账、高风险时明确提示:"请通过另一个渠道(比如直接问对方)核对收款地址的开头和结尾";
- 解释为什么"页面和钱包一致"不够,否则用户会觉得自己已经核对过了;
- 给出替代方案:"不方便核对的话,可以先转一笔很小的金额,请对方确认收到后再转剩下的";
- 在通知邮件里不放可点击的操作链接,引导用户自己打开官网(防止邮件本身成为攻击通道,见《SPF DKIM与DMARC》)。
3.4 和其他防线的关系
| 防线 | 防什么 | 防不了什么 |
|---|---|---|
| 页面完整性巡检 | 页面被长期篡改 | 巡检空窗期内的篡改 |
| 钱包弹窗核对 | 用户在页面上看错了 | 页面被篡改 |
| 带外核对 | 页面被篡改、邮件被冒充、中间人 | 用户懒得做 |
带外核对是最后一道、也是最依赖人的防线。它成本最高,所以只在最关键的时刻要求,和风控评分与摩擦设计的思路一致。
总结
| 层次 | 要点 |
|---|---|
| 直觉 | 不能用骗子给的号码去核实骗子 |
| 本质 | 核对必须走一条攻击者控制不了的独立通道 |
| 应用 | BEC 回拨、银行核实、安全码、硬件钱包屏幕 |
| 产品 | 关键时刻提示、解释原因、给出小额试转的替代方案 |