主页 > imtoken安卓版版本下载 > 确定性钱包、它们的好处和被低估的陷阱

确定性钱包、它们的好处和被低估的陷阱

imtoken安卓版版本下载 2023-05-27 06:44:13

如果你在去年一直关注比特币钱包的发展硬盘坏了比特币就没了吗,那么你很可能已经知道后端设计的最新趋势:确定性钱包。 与老式比特币钱包(根据需要随机生成新的比特币地址和私钥)不同,在确定性钱包中,所有数据都来自使用特定算法生成的“种子”。 也就是说,如果你记录你确定性钱包的“种子”,6个月后你的硬盘坏了,钱包就没办法恢复了。 在这种情况下,你可以同时创建同一个“种子”的新钱包,你旧钱包中的所有地址和私钥都会重新出现。 钱包发展的这种趋势几乎得到了所有人的称赞,几乎所有控制多个地址的比特币客户端都已经实现了确定性钱包功能,或者正在计划实现它。

Bitcoin-wallet

然而,确定性钱包并不止于此。 事实上,最新的确定性钱包超越了上述简单设计,并拥有两个被开发人员吹捧的关键属性。 第一个主要特征是称为“主公钥”的概念。 主公钥是可以通过钱包的主私钥(即“种子”或其衍生物)生成的秘钥。 它能够生成比特币钱包中的所有地址,但不包括私钥。 因此,拥有主公钥的人可以查看确定性钱包的余额,但无法使用它们,因为他们无法生成与每个地址对应的私钥。 第二大特点是“层次结构”:你从主私钥生成的私钥本身可以成为主私钥,从而充当确定性钱包。

确定性钱包的工作原理

原来目前有两种确定性钱包:Electrum钱包和BIP32钱包; 它们使用的算法非常相似,这使得它们都具有“主公钥”的特性,而 BIP32 钱包更进一步——它还具有“层次结构”特性,Electrum 钱包被设计成只有两个层次的组织,虽然 Electrum 协议可以扩展以支持层次结构。

“主公钥”属性可能是确定性钱包更令人惊讶的属性,我们将首先研究它。 它起作用的原因是比特币公钥(与比特币地址不完全相同,但密切相关)可以像普通整数一样进行加减(但是你不能组合两个公钥)。 密钥),因此可以在两个“级别”上执行相同的算术运算——生成私钥,算术运算在整数级别执行; 而要生成公钥,则算术运算是在公钥层面进行的。

所有确定性钱包系统使用的确切算法如下。 为了计算第 i 个私钥(这里假设 i=5),使用一个带有变量 i 和主公钥的函数(从技术上讲,是一个散列)来计算一个“偏移值”参数。 然后把主私钥和那个偏移值加在一起(译者注:可以得到第i个私钥)。 为了计算出第i个公钥,然后用同样的方法计算偏移值,将这个偏移值转换成一个公钥,然后加上主公钥和偏移值公钥(译者注:可以得到第 i 个公钥)。

下面是一些使用 Electrum 钱包的示例,使用我自己的 pybitcointools 库完成。

首先,我们从“种子”生成主私钥和主公钥:

> 种子 = random_electrum_seed()

'afc3eef71d96c468ca52b437c385a621'

> mprivkey = electrum_stretch(种子)

'5df10c922a1c7888b5c3a5a7106e72576f09c17f0993f4f2ce0ef5ccdb2f53c5'

硬盘坏了比特币就没了吗_比特币 硬盘涨价_比特币是储存在硬盘上吗

> mpubkey = '04'+electrum_mpk(mpprivkey)

'04fd6d91db1bdfc231116fd7d44c61a02e032b38b90aad419ecf75acf501eebdc7a0b7818e16a97a6c87693c723106e6fe17d4da743fae991139b05e6d1fe5c8a8'

现在,我们生成私钥编号 0:

> offset = dbl_sha256('0:0:'+mpubkey[2:].decode('hex'))

'429251ad9607fd39040072d23f53d54fc3b1ea526310fa45ca2a2df0629e2db2'

> priv0 = add_privkeys(mprivkey,offset)

'a0835e3fc02475c1b9c418794fc247a732bbabd16ca4ef38983923bd3dcd8177'

现在,公钥:

> pub0 = add_pubkeys(mpubkey,privkey_to_pubkey(offset))

'04d96f3a8ebb0de48a98a5d77003c1d3ed5a36aae3eb20ee138a233e0c644becf77263c6e56cca6cfe064eb87582dcf92e9066d567ae0ffa67b0a5a4fda2bd7d68'

> addr = pubkey_to_address(pub0)

'14EkQ9qsKxWKiBJm5f7mT7ozSKKZbQoZGS'

硬盘坏了比特币就没了吗_比特币 硬盘涨价_比特币是储存在硬盘上吗

然后,看看我们的成功:

> privkey_to_pubkey(priv0)

'04d96f3a8ebb0de48a98a5d77003c1d3ed5a36aae3eb20ee138a233e0c644becf77263c6e56cca6cfe064eb87582dcf92e9066d567ae0ffa67b0a5a4fda2bd7d68'

我们可以重复这个过程来生成其他键(数字1、数字2等); 如果您有 Electrum 钱包,请亲自尝试。 关键在于:您可以安全地将您的主公钥留在不安全的地方,甚至在必要时将其交给审计员等第三方; 自己保管万能钥匙就好了。 私钥(和“种子”)。

层次结构

现在,让我们开始层次结构属性的主题。 这最好用例子来说明。

> w = bip32_master_key('qweqweqweqweqwe')

'xprv9s21ZrQH143K2KhRQVuMqhz798mvW89J1aJMWEKNfZzv3BPAgBc4TH59K8ZcLt8RrNJvbUzA72A92Grm3MorG2FnFaoZ7B8SDTYXgUBALoi'

> w0 = bip32_ckd(w,0)

'xprv9uyTuGongdyZAMxZ2euUBbpsAdtE2nxFBmcQn89UT4ZyzrMg5TXD7azCnsnpH9Q7yrYgG7nVakE6BTxJUarLrDA28VxS3ZWDsgYWZUxtNiH'

> w000 = bip32_ckd(bip32_ckd(bip32_ckd(w,0),0),0)

'xprv9zL8JVf2Us8VKFYoi3A8F3LSFuHnxNhAdVyrWuECgcbW13WcSrAZt9QxbbMvrFZsvUtrktVpNJ5iN1JhgUYDZoeXC5qtGfLuLw3reVWSRir'

硬盘坏了比特币就没了吗_比特币 硬盘涨价_比特币是储存在硬盘上吗

该功能的主要用例是在层级组织中:公司的财务人员可以控制 BIP0032 钱包的根私钥,并将每个“子种子”交给公司的各个部门,每个部门然后使用获得的seeds 来操作自己的钱包。 财务主管将拥有一切的万能钥匙,但每个部门只会持有自己那部分资金的钥匙。

当然,BIP32 和 Electrum 具有相同的主公钥属性,但更健壮:

> wp = bip32_privtopub(w)

'xpub661MyMwAqRbcEomtWXSNCqvqhAcQuas9NoDxJcizDuXtuyiKDivK15PdAPVkPwVXT9rFbjAnE9P3sLh6xnDawXF1uUXrruH1UvALHF89qdP'

> wp000 = bip32_ckd(bip32_ckd(bip32_ckd(wp,0),0),0)

'xpub6DKUi1BvKEgnXjdGp4h8cBHAow8HMqR1ziuTKHdpEx8UsqqkzPUpRwjSStDzFc5ALo93wyYXmRr9rvXWcrfw5MPFKCET11KFg3kNrESyWZ6'

> wp000_2 = bip32_privtopub(w000)

'xpub6DKUi1BvKEgnXjdGp4h8cBHAow8HMqR1ziuTKHdpEx8UsqqkzPUpRwjSStDzFc5ALo93wyYXmRr9rvXWcrfw5MPFKCET11KFg3kNrESyWZ6'

这样,BIP32的主私钥就可以看作是一个无限层次的n叉树的顶端,它下面的每一个私钥都可以被恢复。 而BIP32的主公钥也是如此,只不过它只能用来恢复所有的公钥和地址。 我们也打个比方,私钥就像在雨林树冠之上,公钥在它下面的地面上。 无论从哪里跳,最终的目的地地面都是同一个地方,但是一旦到达地面,就不能再爬上去(可以从公钥地层爬到私钥树冠上面的猴子,至少在目前,它只存在于理论上)。

一个被低估的问题

从上面的描述中,我们可以看出,你可能已经知道确定性钱包有两大特点。 首先,您可以从父键追溯到子键,但反过来不行。 其次,您可以安全地提供您的主公钥,而不会威胁到您的资金安全。 而且,这就是今天几乎每个人(至少是那些足以理解什么是确定性钱包的技术人员)看到 BIP0032 钱包的方式。 公司模式(将子密钥交给各个部门,将主公钥交给会计师和审计师)在BIP0032钱包的发展前景中占有重要地位。 然而,正如我们将看到的,这种对分层钱包的描述存在致命缺陷。

这就是问题所在:虽然您当然可以交出子密钥而不冒父密钥的风险,并且您可以交出主公钥而不冒主私钥的风险,但您不能同时进行这两项操作。 事物。 如果发生这种情况,破解将非常简单,只需两行 pybitcointools 代码即可实现。 我将以 Electrum 为例,因为 Electrum 钱包更加透明。 下面是我之前创建的主公钥和子私钥:

比特币是储存在硬盘上吗_比特币 硬盘涨价_硬盘坏了比特币就没了吗

> mpubkey

'04fd6d91db1bdfc231116fd7d44c61a02e032b38b90aad419ecf75acf501eebdc7a0b7818e16a97a6c87693c723106e6fe17d4da743fae991139b05e6d1fe5c8a8'

> priv0

'a0835e3fc02475c1b9c418794fc247a732bbabd16ca4ef38983923bd3dcd8177'

如上图,第一个私钥可以通过公式计算:mprivkey + calc_offset(mpubkey, index)。 那么,我们应该怎么做呢? 如果你仔细想想,答案是显而易见的:

> offset = dbl_sha256('0:0:'+mpubkey[2:].decode('hex'))

'429251ad9607fd39040072d23f53d54fc3b1ea526310fa45ca2a2df0629e2db2'

> mprivkey_2 = subtract_privkeys(priv0,offset)

'5df10c922a1c7888b5c3a5a7106e72576f09c17f0993f4f2ce0ef5ccdb2f53c5'

哈哈,我们得到了主私钥。 现在,我们可以提取这个钱包中的所有其他地址,甚至是那些钱包所有者从未想过的地址。 我什至在 pybitcointools 中提供了一个命令来使这更容易:

> crack_electrum_wallet(mpubkey,priv0,0)

'5df10c922a1c7888b5c3a5a7106e72576f09c17f0993f4f2ce0ef5ccdb2f53c5'

比特币是储存在硬盘上吗_硬盘坏了比特币就没了吗_比特币 硬盘涨价

BIP32也有同样的漏洞:

> wp = bip32_privtopub(w)

> w0 = bip32_ckd(w,0)

> crack_bip32_privkey(wp,w0)

'xprv9s21ZrQH143K2KhRQVuMqhz798mvW89J1aJMWEKNfZzv3BPAgBc4TH59K8ZcLt8RrNJvbUzA72A92Grm3MorG2FnFaoZ7B8SDTYXgUBALoi'

公平地说,我们需要注意这不是突然出现的零日漏洞; 许多比特币开发者已经知道它有一段时间了。 然而,许多人暗中提倡的对分层钱包的直观理解,包括将子密钥移交给组织的各个部分以及将主公钥移交给审计员的想法,完全破坏了这些确定性钱包所具有的东西。 安全。 一家大型组织决定使用分层确定性钱包来保护其比特币资金,并突然发现其部门负责人之一和一名审计员密谋将整个公司的资金带走,这可能只是时间问题。 迟早。 所以现在很明显的问题是:这个错误可以修复吗? 答案似乎是否定的; 由于对公钥唯一可行的操作是加法和减法,因此实现具有主公钥属性的确定性钱包的唯一方法是使用此处描述的“抵消”机制。 如果这一切都是真的,那么提高认识是唯一的解决方案,同时在客户端进行更改以明确主公钥功能和分层钱包功能不应一起使用。

这个漏洞可能还有一种方法:制作三个分层的BIP32钱包,沿着特定的子密钥推导路径生成所有地址,每个地址都是这三个钱包签名地址的2-of-3组合(译者注:也就是说, 3 个私钥中任意 2 个的任意组合可用于签名和发行硬币)。 然后,审计员可以获取三个主公钥之一,并在区块链中搜索所有交易,这些交易的脚本包含从该主公钥派生的所有公钥。 此解决方案很复杂,不受任何现有客户端的支持,而且远非完美,但像这样的方法是避免此漏洞的唯一方法。 在大多数情况下硬盘坏了比特币就没了吗,最好不要释放主公钥。

那么,确定性钱包的未来是什么? 从目前来看,BIP0032可以说到此为止; 一个重要的升级可能是BIP0032合成签名钱包,它结合了BIP0032的分层确定性魔法和比特币的一个高级特性(3个私钥中的任意2个(只有当密钥组合在一起才能发出签名)组合在一起。 未来的另一个方向是大脑钱包。 记忆比特币钱包有两种方式: 1.选择密码,以密码或密码的哈希值作为种子; 2、随机生成一个种子,将种子转化为可逆方式的String编码。 这两种方式的实现目前都存在一些缺陷——第一种方式的标准实现不抗暴力破解,但是第二种方式的标准(Electrum)实现方式太难记——研究表明,码字像“glow date cost bloody curve wheel cousin picture ring finally bubble press”之类的东西并不比等价物更容易记住,而且如果不忘记一两个词就无法取回钱包。 这些是开放式问题——如果你是比特币开发者,你就有机会想出一个解决方案并将其作为标准答案。

原版的

作者:Vitalik Buterin

翻译 He1l_Q

如果这篇文章有帮助,请考虑捐赠:15X9AMhccjqqPRkhpgraoj7fgdqymW3iSC

欢迎转载,转载请注明作者、译者、出处,谢谢支持!