“一条缺失单词的助记词,能否靠 30 行脚本在 2048 种可能中定位正确组合?”
下面是我的亲历记录——从一通深夜电话到 BIP39 暴力破解的全过程,中间穿插可复制的核心思路与防丢技巧。
故事开端:电话那头的慌乱
“Alexis,我 MetaMask 登不上了……22 个 ETH 加一堆 Doodles、无聊猿全锁里头,合计 30 万美金!”
我朋友在电话里嗓音发颤。他把 Chrome 扩展卸载重装后,才惊觉当初 只手抄了 11 个单词,漏写了一个。雪上加霜的是,为了干扰旁人,他还额外插入了“emotions”“pelican”两词,导致最终手里只剩 11 条有效词。
我第一反应:钱包基本等同于“烧毁”。但工程师的固执战胜绝望——先研究再认输。
抢救第一阶段:Vault Decryptor 的死胡同
朋友朋友的朋友甩来一个“官方救星”MetaMask Vault Decryptor。借助远程截图,我们按文档操作:
- 打开浏览器开发者工具的 Console。
chrome.storage.local.get('data', …)尝试拉取 vault 数据。
结果:keyringController.vault 为空。通过 MacOS Finder 去 ~/Library/Application Support/Google/Chrome/Default/… 找本地 .ldb 文件时,发现扩展重装后旧文件已被新文件覆盖。
结论:Vault 这条线失败,方案归档。
FAQ:Vault 解密到底靠不靠谱?
- Q:任何人都能用 Vault 恢复钱包吗?
A:只有在浏览器未重装、.ldb文件完整,且你知道账户密码的情况下可行。 - Q:一定要 12 个密语才算标准?
A:MetaMask 默认生成 12 词,但也支持用户升级到 18 或 24 词,基本原理一致。
抢救第二阶段:手动暴力失败的 2048 次点击
我本体不常用 MetaMask,于是本地装了一份旁路测试,索性打开 BIP39 英文词库——共 2048 个词汇,排列出 11 + 1 的组合。
先假设缺失词在第 4 位,用 abandon, ability, able… 一路试过去。
第 6 次就生成了“有效”的 12 词钱包,但 ETH 余额 0。再往下,“accident”“acid”“alarm”等等也撞出有效地址——只是都不是目标钱包。
粗略算得:6% 的 BIP39 词在随机位置能被 MetaMask 识别,想靠人工穷举 2048×12 ≈ 2.5 万次点击,显然不现实。
FAQ:为什么 MetaMask 会认可那么多无效私钥?
- Q:这是不是安全隐患?
A:BIP39 校验机制只验证最后一个“校验位”,因此 2048 词仍有可能生成通过长度校验、但无对应资金的钱包地址。资金不冲突,概率极低,大可放心。
抢救第三阶段:Node.js 30 行脚本直击链上
思路转化为自动化:
- 语言:Node.js(最短路径,库多)
- 依赖:
ethers包(钱包生成 + 链上查询) 流程:
- 读取 2048 行 BIP39 词典。
- 对剩余 11 词,逐位放置一个占位符,尝试 2048 种补全。
- 用
ethers.Wallet.fromMnemonic生成地址,判断与已知钱包是否一致。 - 若匹配,立即终止循环并输出助记词与私钥。
最小可运行代码(核心 20 行):
const ethers = require('ethers');
const fs = require('fs');
const bip39Words = fs.readFileSync('./bip39.txt', 'utf8').split('\n').map(w => w.trim());
const known11 = 'apple banana cat dog elephant frog grape house ice juice king'.split(' ');
const targetAddr = '0x82...'; // 朋友的真实地址
for (let pos = 0; pos < 12; pos++) {
for (const w of bip39Words) {
const seed = [...known11];
seed.splice(pos, 0, w);
const phrase = seed.join(' ');
try {
const wallet = ethers.Wallet.fromMnemonic(phrase);
if (wallet.address.toLowerCase() === targetAddr.toLowerCase()) {
console.log('🎉 命中文本:', phrase);
console.log('🔐 私钥:', wallet.privateKey);
process.exit(0);
}
} catch {}
}
}早上 9 点 21 分,循环到 缺失词在第八位 时命中,magic word = “remind”——极富戏剧性的单词!OpenSea 一刷新,22 ETH、Doodles、无聊猿安然无恙。
FAQ:这把戏人人能用吗?
- Q:少了第 2 个单词还能救吗?
A:每缺失 1 词 ≈ 2048×12 次组合;缺失 2 词 ≈ 2048²×C(12,2) ≈ 1500 万次查询,普通 PC 仍需数小时,已不推荐。 - Q:助记词在别人手里恢复安全吗?
A:不安全,直接作废,应立刻建新钱包、转全部资产。手中有助记词即“拥有私钥”,等同于物理控制。
终局与彩蛋:再提一次“remind”
钱包找回后,我们与朋友的共同决策:
- 生成全新助记词,全部资产一次性转入。
- 把旧助记词彻底吊销,任何照片、即时通讯记录全部删除。
- 冷钱包+助记词金属板 为长期方案,杜绝下一次“remind”事件。
一份小小清单:保护助记不翻车
- 书写时请 一字一词核对,确认 12/18/24 个完整无遗漏。
- 两份离线备份:一份防火金属板,一份防火塑料袋隐身存放。
- 永远不要让第二个人临时保管你的见证纸条,即使是家人。
- 有人替你恢复钱包,完成后立刻换新钱包,视同旧助记泄露。
- 每半年做一次“纸上备份巡检”,如有模糊痕迹就重新抄写并销毁旧版。
如果你对 BIP39 暴力逻辑、自定义脚本、或冷钱包选型还想深挖,继续阅读本站后续“安全系列”。愿你永远不需要“remind”第二次。