加密社
看了这篇指南,你将了解助记词和密钥地址(qianbao)背后的基本原理。
以及,如何找回你的大饼密钥。
Not your key, not your coin
如果你不掌握自己加密货币钱包的私钥,那么你实际上并不能完全控制你的资产
在当今数字化的世界里,加密货币已成为许多人投资组合中不可或缺的一部分。
然而,随着这一新兴资产类别的普及,随之而来的是管理和保护这些资产的新挑战。
尤其是对于比特币这样的加密货币,安全性至关重要。一旦丢失了访问钱包所需的私钥或助记词,你的比特币可能就会永远消失。
本文旨在为你提供一系列实用的步骤和建议,帮助你在不小心丢失钱包访问信息的情况下,安全地找回你的比特币。
无论你是加密货币新手还是经验丰富的用户,都能从中受益。我们将探讨助记词的重要性、不同类型的比特币钱包以及最佳的安全实践,以确保你的数字资产得到最有效的保护。
-
从助记词到地址,发生了什么
私钥就像是你的超级机密密码,它实际上是一串很长的数字,具体来说是由0和1组成的256位的随机数字串。
你可以把它想象成一串非常长且复杂的大门钥匙,只有这把钥匙能够打开你存放珍贵物品的保险箱(比特币钱包)。
因为这串数字非常复杂,所以很难被猜到或者破解。
当你需要证明这些珍贵物品属于你的时候,就需要用这把钥匙来做个标记(签名),证明这些物品确实是你的。
这就是为什么私钥如此重要,“Not your key, not your coin” 在加密市场广为流传的原因。
公钥则是由这串超级机密的私钥通过一种叫做椭圆曲线算法计算出来的。
这个过程就像是一种单行道,你可以很容易地从私钥计算出公钥,但是有了公钥,别人却无法推算回私钥。
公钥就像是你的保险箱上的一串号码,别人可以用这个号码确认这个保险箱确实是你的,但他们打不开它。
最后,从公钥出发,经过一系列的转换处理(也就是哈希函数和编码步骤),你会得到一个地址。
个地址类似于你的邮寄地址,其他人可以用它来给你发送比特币。地址是公开的,任何人都可以看到,但它不会泄露你的私钥或公钥。
哈希算法和非对称密码学为此提供了安全上的保障
-
wallet.dat
在早期的比特币钱包软件中,每当用户需要一个新的接收地址时,钱包就会生成一个新的私钥,并基于这个私钥创建一个新的地址。
这意味着用户使用的地址越多,对应的私钥数量也会越多。
这些私钥之间没有任何关联,这就导致每个私钥都需要单独备份,给用户带来了很大的麻烦。
那时候,用户通常需要定期备份一个名为“wallet.dat”的文件。
这个文件包含了所有的私钥信息。如果这个备份文件丢失了,那么用户将无法找回他们的资金。
那么,如何让不同的私钥之间产生联系呢?
助记词又是如何取代这种繁琐且危险的备份方式的呢?
这就要从三个重要的 BIP(Bitcoin Improvement Proposals)说起。
BIP39:助记词
BIP39 可能是你听到最多的一个标准了。它让备份私钥这件事变得简单了很多。想象一下,如果你要记住的是一串像“5Kb7k3FUPP6a....”这样的字符,不仅难记,而且输入时还很容易出错。
但是有了 BIP39,你可以把私钥变成一组单词,比如“abandon abandon ability about above absence absent absolute absorb”,这样是不是感觉容易多了?
你只需要记住这些单词,就能恢复你的钱包。这也是为什么现在很多比特币钱包都采用了助记词的方式让用户备份自己的钱包。
不过,仅有助记词还不够。因为如果你每次使用一个新的比特币地址,就等于是在用一个新的私钥,理论上来说,你需要为每一个新地址都生成一个新的助记词。
这样做显然还是太麻烦了,和以前直接备份那个“wallet.dat”文件差不多。
那么,目前常用的这些钱包,是如何做到通过一个助记词管理一大堆钱包地址的呢?答案是:BIP32。
BIP32:分层确定性钱包
想象一下你有一把神奇的钥匙,这把钥匙就像是一个超级母钥匙,我们叫它“主密钥”。
有了这把主密钥,你可以变出无数把其他的钥匙,这些钥匙就是“子密钥”。
而且神奇的是,这些子密钥中的任何一个又可以再变出更多的钥匙。这就像是你在玩一个“钥匙魔法”,可以从一把钥匙开始,不断地创造新的钥匙。
“分层”这个词在这里的意思就是像一棵树一样。树有一个树根,然后树根长出树枝,树枝再长出小枝条,如此类推。BIP32 就是这样的结构:
通过分层派生密钥的方式,我们可以拥有几乎无限的比特币地址。
想象一下,你有一个“种子”(主密钥),这个种子可以长成一棵大树。这棵树的每个分支都代表一个不同的地址。
虽然这些地址看起来彼此独立,但实际上它们都来源于同一个“种子”。
那么,如何建立这些扩展密钥和主密钥之间的联系?派生路径登场!
派生路径
派生路径就像是一个地址的“家谱图”,它告诉你这个地址是怎么从主密钥一步步生成的。
就好比你在家庭中,你的名字后面可以加上一系列的关系描述,比如“我是张三的儿子,李四的孙子,王五的曾孙”。
在比特币钱包中,派生路径通常是用一组数字来表示的。例如:
m / 44' / 0' / 0' / 0 / 1
这里的 m
表示“主密钥”,后面的数字则表示了具体的派生步骤:
-
44'
:表示这是用于加密货币的路径。 -
0'
:表示这是比特币的路径。 -
0'
:表示这是第一个账户。 -
0
:表示这是第一个子账户。 -
1
:表示这是第一个子账户下的第二个地址。
当你使用一个助记词(例如 BIP39 的助记词)来恢复钱包时,助记词会生成一个主密钥。
然后,根据你设置的派生路径,这个主密钥会逐步生成你需要的所有地址。
到这里,聪明的读者会发现:如果仅仅依靠助记词本身,是无法直接得到某一个具体的地址的。
必须加上派生路径,才能推导出具体的比特币地址。但是,为什么在大多数情况下,我只是把助记词导入到钱包,曾经用过的那些地址就出来了?
这就要提到BIP44标准了
BIP44:派生路径定义规范
BIP44 为“派生路径”中的每一层都赋予了特定的意义。派生路径的形式如下:
m / purpose' / coin_type' / account' / change / address_index
-
m:
-
这个
m
就是“主密钥”(master)的意思,表示这是从主密钥开始派生的路径。
-
-
purpose:
-
purpose
代表了这个钱包遵循的标准或用途。对于比特币钱包来说,这个数字告诉我们最终生成的比特币地址是什么类型的。 -
例如,
44'
表示这个路径遵循的是 BIP44 标准。
-
-
coin_type:
-
coin_type
代表你要使用的加密货币类型。 -
对于比特币来说,
0
表示主网的比特币,1
表示测试网的比特币。每种加密货币都有自己的编号。
-
-
account:
-
account
表示你在这个路径下想要管理的账户编号。 -
例如,
0
表示第一个账户,1
表示第二个账户,以此类推。
-
-
change:
-
change
定义了这个地址是用来收款还是找零的。 -
0
通常表示收款地址,1
通常表示找零地址。
-
-
address_index:
-
address_index
表示在当前路径下的具体地址编号。 -
例如,
0
表示第一个地址,1
表示第二个地址,以此类推。
-
假设你有一个助记词,你想生成一个比特币的收款地址。派生路径可能是:
m / 44' / 0' / 0' / 0 / 1
-
m
:表示从主密钥开始。 -
44'
:表示遵循 BIP44 标准。 -
0'
:表示比特币(主网)。 -
0'
:表示这是第一个账户。 -
0
:表示这是收款地址。 -
1
:表示这是第一个账户下的第二个地址。
为什么助记词导入后能显示地址?
当你把助记词导入到一个新的钱包时,钱包软件通常会默认使用一个标准的派生路径,例如:
m / 44' / 0' / 0' / 0 / 0
这个路径会生成你的第一个收款地址。大多数钱包都会自动使用这种通用路径,所以当你导入助记词后,它会根据这个路径生成你曾经用过的地址。
这样,你就不需要手动输入复杂的派生路径,钱包软件会自动帮你处理这些细节。这就是为什么助记词导入后,你的钱包可以显示出你以前用过的地址。
以下是比特币钱包中常用的三种地址派生路径标准的总结:
BIP44
-
P2PKH 地址:这是最传统的比特币地址,通常以数字
1
开头。
-
派生路径:为了生成这样的地址,我们使用
m/44'/0'/...
这样的路径。
-
意义:这个路径表示我们遵循 BIP44 标准来生成地址,主要用于非隔离见证的传统比特币地址。
BIP49
-
P2WPKH-nested-in-P2SH 地址:这是一种混合型地址,它实际上是将新的隔离见证(SegWit)地址嵌套在旧的支付到脚本哈希(P2SH)地址里,通常以数字
3
开头。
-
派生路径:为了生成这样的地址,我们使用
m/49'/0'/...
这样的路径。
-
意义:这个路径表示我们遵循 BIP49 标准来生成地址,主要用于向后兼容旧的钱包系统,同时也能享受隔离见证的一些好处。
BIP84
-
P2WPKH 地址:这是纯粹的隔离见证地址,通常以
bc1q
开头。
-
派生路径:为了生成这样的地址,我们使用
m/84'/0'/...
这样的路径。
-
意义:这个路径表示我们遵循 BIP84 标准来生成地址,主要用于完全支持隔离见证的新式比特币地址。
正是因为有了这些标准的派生路径,钱包软件才知道如何生成不同类型的比特币地址。
当你导入助记词时,钱包软件可以根据你选择的地址类型,自动按照相应的派生路径生成你需要的地址。
因此,用户不需要关心复杂的路径细节,只需要导入助记词并选择地址类型,就可以找回并使用他们的钱包了。
-
怎么找回钱包?
虽然现在有很多标准来帮助生成和管理比特币钱包,比如前面提到的 BIP44、BIP49 和 BIP84,但有时候仅有助记词还是不够的。
这是因为并不是所有钱包都严格遵循这些标准,有些钱包可能会有自己的做法,导致一些特殊情况出现:
-
有些钱包没有遵循这些标准:这意味着它们可能用了不同的方法来生成地址。
-
即使遵循了标准,也可能与其他钱包不一致:不同的开发者可能对同一个标准有不同的理解或实现方式。
-
采用了较新的标准,但支持的钱包还不多:新标准可能还没被广泛接受。
实际例子
-
Electrum 钱包:如果你用的是 Electrum 钱包,并且尝试把助记词导入到其他钱包中,可能会遇到问题,因为 Electrum 有自己的助记词系统,而不是通用的 BIP39 标准。
-
Ledger 硬件钱包:如果你是 Ledger 硬件钱包的用户,并且想要把助记词导入到另一个钱包,可能会发现生成的地址不一样。这是因为 Ledger 使用了自己的派生路径,和其他钱包不一样。
由于这些不一致性,很多用户在尝试找回他们钱包里的资金时遇到了麻烦。因此,有一些网站,比如 Wallets Recovery,可以在上面试试。
当我们了解了钱包生成的规则,让我们回到最开始的话题
如何找回钱包?
三部曲:
hashcat
是一个破解密码的工具。你需要先下载并安装它。安装好之后,打开命令提示符(Windows)或终端(Mac/Linux)。
在命令行中输入以下命令:
-
准备字典文件:
字典文件是一个文本文件,里面包含了各种可能的密码组合。你可以自己创建一个,或者从网上下载一个现成的字典文件。这个文件通常命名为
example.dict
。 -
安装并打开 hashcat:
-
运行 hashcat 命令:
.\hashcat.exe -a0 -m11300 .\wallet.txt .\example.dict
-
这个命令的意思是:
-
.\\hashcat.exe
:运行 hashcat 程序。 -
-a0
:使用模式0,即简单的暴力破解模式。 -
-m11300
:指定模式为比特币钱包文件(wallet.dat
)的哈希类型。 -
.\wallet.txt
:这是你要破解的文件,通常是从wallet.dat
中提取出来的哈希值。 -
.\example.dict
:这是你准备好的字典文件。
-
如图
一个包含 13 万个密码的字典文件,用 hashcat
跑一遍只需要 4 分钟。你会发现,只要你的密码不是特别复杂,找回密码的可能性很大。
但是,最关键的问题是如何从钱包文件中提取出哈希值。
你在网上找到了一个叫做 bitcoin2john.py
的脚本,据说可以用来从 wallet.dat
文件中提取哈希值。
你尝试了好几次,配置了 Python 环境,但每次都失败了。后来你才发现,这个脚本已经过时了,不再适用。
紧接着你又发现一些在线解析网站(且不提在线解析是在帮别人打工的问题)
也都会返回一些莫名其妙的错误,例如:
unexpected file type or format Couldn't open wallet.dat/main. Try quitting Bitcoin and running this again.
让我们回到初心,回到BTC的源码的研究
GitHub - bitcoin/bitcoin: Bitcoin Core integration/staging tree
经过几天的分析,编译,调试。
我找到了钱包部分,稍加修改,就输出了hash
后续我会在Github开源我的程序,但目前还在测试阶段,需要的话可以免费加入社群后,将.bat文件发给我一起研究讨论。