一线大厂高级前端编写,前端初中阶面试题,帮助初学者应聘,需要联系微信:javadudu

加密钱包助记词丢失后的一天

背景知识

了解数字货币的朋友肯定都知道助记词是什么,丢失意味着什么,为了让不了解的朋友也能愉快的读完本文,我简单介绍下;

数字货币是区块链技术的产物,其鼻祖就是比特币,随着 2009 年比特币诞生以来,通过在其基础上改进和创新,已经形成了越来越多的新的数字货币类型,目前已经超过 6000+ 种;数字货币的交易一般是用币安、Coinbase 等中心平台化交易所,或者去中心化交易所(DEX),长期保存一般是用加密钱包;

助记词是一种安全机制,用于生成和恢复加密钱包,可以说是保险箱 + 钥匙、是银行卡 + 密码。

事故起因

事情就是这么个事情,助记词丢了,又没完全丢,如果找不回来的话,损失万元以上,当然了和当初抄币被割的钱来说,不算什么了,不过仍然不爽啊。

那是 21 年时候,偶然接触区块链,数字货币这些概念,基于了解学习的心态,购入了几种数字货币,后来就放入了加密钱包中,并且生成了助记词,写到了一张纸上,保存了下来。

加密钱包助记词丢失后的一天

加密钱包助记词丢失后的一天

时间过去了这么久,中间也经历了换手机等操作,最近闲来无事就从应用市场下载了一个加密钱包,准备还原下钱包,看看当时购买的数字货币现在还有没有价值,于是找到小纸条(还好没弄丢),尝试导入,没想到提示 ”非法助记词,请检查“ ,我瞬间懵逼了,难道手抄抄错单词了,反复检查后,终于定位到了原因;

本来 12 位的单词,我竟然只抄下来了 11 位,缺少了一个单词,是没法还原钱包的,想想可能的大几万资产,我真是欲哭无泪,躺在床上翻来覆去睡不着,实在不甘心呀,于是抱着最后的希望打开谷歌,看看有没人遇到类似的情况的,经过一番查找,终于找到了线索,预计缺少一个助记词的情况下,暴力破解,可能的助记词组合大概有 2048 * 12 = 24576 种,那就是说理论上只要一个个尝试,还是可以找回的,算是有了点希望,想到这个总算平静了下来。

找回助记词

第二天早早的起床收拾好,开始研究了起来,首先从助记词的生成原理开始了解,助记词一般由 BIP39 协议生成,这是一个在加密领域广泛应用的标准,它的主要目的是将种子随机数(seed)转换成易于记忆和记录的单词序列,从而帮助用户安全地备份和恢复他们的钱包。

BIP39 协议中共收录了 2048 个单词,所以我缺失的那个单词肯定在其中,另外因为我不知道该单词在我的助记词中的顺序,所以说是 2048 * 12 = 24576 种可能的组合,有没有可能再缩小下范围呢?

助记词生成规则:

  1. 创建一个128到256位的随机序列(熵)。

  2. 提出SHA256哈希前几位(熵长/ 32),就可以创造一个随机序列的校验和

  3. 将校验和添加到随机序列的末尾。

  4. 将序列划分为包含11位的不同部分。

  5. 将每个包含11位部分的值与一个已经预先定义2048个单词的字典做对应。

  6. 生成的有顺序的单词组就是助记码。

加密钱包助记词丢失后的一天

通过助记词的创建规则,可以看到一个检验和的概念,它是一个计算机术语,在BIP39助记词的背景下它的主用是保证助记词序列的一致性和有效性,如果随机挑选12个单词,这些单词极可能不符合原始随机数和校验和的正确组合,因此不满足BIP39的校验规则

也就是说如果完全随机生成的话, 2048 * 12 = 24576 种理论组合中,应该有很大一部分是无效的组合,这样就能大大缩小范围了,果然官方提供了 validateMnemonic 函数校验助记词有效性, 让我们先写一段代码来测试下:

const bip39 = require('bip39') // BIP-39库
const knownWords = [
  'success', 'hamster', 'scan', 'pool', 'sausage', 'nasty', 'dose', 'melody', 'later', 'display', 'file',
] // 假设已知的11个词如下

const wordlist = bip39.wordlists.english // 使用英文词汇表
const result = []

// missingWordIndex 为丢失的助记词位置索引
function findWord(missingWordIndex) {
  for (let word of wordlist) {
    // 构建带有猜测词的完整助记词
    let tryMnemonic = [...knownWords]
    tryMnemonic.splice(missingWordIndex, 0, word)

    // 检查这个组合是否有效
    if (bip39.validateMnemonic(tryMnemonic.join(' '))) {
      result.push(tryMnemonic.join(' '))
    }
  }
}

for (let i = 0; i < 11; i++) {
  findWord(i)
}

console.log(`找到有效助记词: ${result.length} 个`)
console.log(result)

加密钱包助记词丢失后的一天

执行后发现,共有 1401 个有效的组合,从 24576个缩小范围到 1401个,成果喜人呀,我甚至开心的拿着手机手动一个个尝试导入看看,花了一个小时导入了 100个,热情渐渐湮灭,手也酸了,眼也花了,还是没碰到正确的那一个,导入的钱包资产都是 0;

还有没有进一步缩小范围,最好能直接精准定位到钱包地址的方法呢?等等,钱包地址!!我之前的邮件里好像有加密钱包地址的信息,是一串 hash 字符串 0x67DxxxxxxxxxxxxxxxxxxxxxxxxD84F,如果能通过助记词批量计算出对应的钱包地址,不就可以精确匹配了,研究一番后,发现果然可行的,基本流程是:

  1. 从助记词生成种子,种子是一段二进制字符,是生成私钥和公钥的基础
  2. 从种子生成 hdk 密钥,它包含私钥和公钥信息
  3. 根据特定规则从密钥生成钱包地址,针对不同的加密货币和区块链网络,这个过程可能有所不同,因为不同的网络可能使用不同的算法和标准来生成地址。例如,比特币和以太坊就有不同的地址生成方法。

加密钱包助记词丢失后的一天

最终代码如下:

const bip39 = require('bip39') // BIP-39 库
const { hdkey } = require('ethereumjs-wallet')

const knownWords = [
  'success', 'hamster', 'scan', 'pool', 'sausage', 'nasty', 'dose', 'melody', 'later', 'display', 'file',
] // 假设已知的11个词如下

const wordlist = bip39.wordlists.english // 使用英文词汇表
const targetAddress = '0x67DxxxxxxxxxxxxxxxxxxxxxxxxD84F' // 目标地址

async function getBSCAddressFromMnemonic(mnemonic) {
  const seed = await bip39.mnemonicToSeed(mnemonic)
  const hdk = hdkey.fromMasterSeed(seed)
  const addrNode = hdk.derivePath("m/44'/60'/0'/0/0")
  const wallet = addrNode.getWallet()
  return `0x${wallet.getAddress().toString('hex')}`
}

// 参数为丢失的助记词位置索引
async function findWord(missingWordIndex) {
  for (let word of wordlist) {
    // 构建带有猜测词的完整助记词
    let tryMnemonic = [...knownWords]
    tryMnemonic.splice(missingWordIndex, 0, word)
    let mnemonic = tryMnemonic.join(' ')

    // 检查这个组合是否有效
    if (bip39.validateMnemonic(mnemonic)) {
      let address = await getBSCAddressFromMnemonic(mnemonic)
      if (address === targetAddress) {
        console.log(`位置 ${missingWordIndex} 找到匹配的助记词:`, mnemonic)
        return
      }
    }
  }
  console.log(`位置 ${missingWordIndex} 未找到匹配的助记词。`)
}

for (let i = 0; i < 12; i++) {
  findWord(i).catch(console.error)
}

加密钱包助记词丢失后的一天

终于,丢失的助记词,找回来了!

加密钱包助记词丢失后的一天

总结

如果你的资产在银行里,忘记密码还可以通过平台来找回,这是银行这种中心化机构的优势, 可是对于去中心化的加密货币来说,丢失助记词,就意味着丢失了对账户的控制权,并且没有人能帮你找回,所以一定要慎重对待;

助记词不要联网,最好手抄并验证下,我就是当初抄写完后,没有验证,导致丢失了一个单词都不知道,所幸的是仅仅丢失了一位, 其余的 11 个单词都在并且顺序正确,所以才可以通过穷举法来找回来,如果丢失的更多,估计神仙也没办法了。

相关资料:

  1. jingyecn.top/blockchain-…
  2. www.liaoxuefeng.com/wiki/120729…
  3. fpchen.readthedocs.io/zh/furo/not…
  4. github.com/dabankio/wa…

建了个技术讨论群,欢迎加入 v: 1032151090

文章更新平台:掘金知乎Github、公号【编码美学】。

原文链接:https://juejin.cn/post/7311882547687784500 作者:Ethan_Zhou

(0)
上一篇 2023年12月14日 上午12:45
下一篇 2023年12月14日 上午12:55

相关推荐

发表评论

登录后才能评论