确定性钱包,它们的优势以及被低估的缺陷

区块链技术巴比特2017-11-25 06:45:20  阅读 -评论 0

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

确定性钱包,它们的优势以及被低估的缺陷

但是,确定性钱包不止于此。事实上,最新的确定性钱包已经超越了上面所描述的简单设计,并且拥有两大关键属性,这两大特性被它们的开发者大肆宣扬。第一大特性,是一个叫做“主公钥master public key”的概念。主公钥是一枚可以通过钱包的主私钥(就是“种子”或者其衍生物)生成的秘钥,它拥有生成一个比特币钱包里所有地址的能力,但不包括私钥。如此这般,拥有主公钥的人可以查看一个确定性钱包的余额,但不能花掉这些余额,因为他们没有办法生成对应于每个地址的私钥。第二大特性,是“层级结构”:你从主私钥生成的私钥,本身就可以成为一把主私钥,并因此充当一个确定性钱包。

确定性钱包的工作原理

事实证明,当前有两大类型的确定性钱包:Electrum钱包和BIP32钱包;它们使用的算法非常类似,这使得它们双双拥有“主公钥”的特性,BIP32钱包走得更远——它还拥有“层级结构”的特性,Electrum钱包是被设计成只有两级的机构,尽管Electrum协议是可以进行扩展以支持层级结构的。

“主公钥”特性可能是确定性钱包的更加让人惊讶的特性,并且我们将首先研究它。它行之有效的原因是,比特币的公钥(和比特币地址不完全是一回事,但有紧密的关系)可以像普通整数一样进行加减(尽管如此,但你不能把两个公钥相乘),并因此同样的算术运算可以在两个“级别”上进行——要生成私钥,算术运算在整数的级别上进行;而要生成公钥,算术运算就在公钥的级别上进行。

被所有确定性钱包系统使用的精确算法如下。为了计算第i号私钥(这里假设i=5),那么就先使用一个带有变量i和主公钥的函数(技术上来说,是个哈希)计算一个“偏移值”参数。然后就把主私钥和那个偏移值加在一起(译者注:就能得到第i号私钥了)。为了计算第i号公钥,那么就用同样的方法计算出那个偏移值,把这个偏移值转换成一把公钥,然后把主公钥和这个偏移值公钥相加(译者注:就能得到第i号公钥了)。

下面是几个使用Electrum钱包的例子,通过使用我自己的pybitcointools库完成的。

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

> seed = random_electrum_seed()

‘afc3eef71d96c468ca52b437c385a621′

> mprivkey = electrum_stretch(seed)

’5df10c922a1c7888b5c3a5a7106e72576f09c17f0993f4f2ce0ef5ccdb2f53c5′

> mpubkey = ’04′+electrum_mpk(mprivkey)

’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钱包的根私钥,并把每个“子种子”交给公司的各个部门,各个部门然后使用得到的种子来运作他们自己的钱包。财务官将拥有一切的主密钥,但每个部门将只会持有他们自己那部分的资金的密钥。

当然,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'

公平的说,我们需要留意这不是一个突然发现的0day漏洞;许多的比特币开发者已经知道这个漏洞有一段时间了。但是,根据很多人暗中推动的对层级式钱包的直观理解,包括把子密钥交给组织的各个部分并把主公钥交给审计员的理念,彻底的瓦解了这些确定性钱包所拥有的安全保障。某家大型组织决定采用层级式确定性钱包来保护它的比特币资金,并且突然发现它的一名部门负责人和一名审计员合谋把整个公司的资金卷走了,这可能只是一个时间上早晚的问题。所以现在有个显而易见的问题:这个漏洞可以被修复吗?答案似乎是否定的;因为对公钥的唯一可行的运算就是加减,实现带有主公钥特性的确定性钱包的唯一途径是使用这里描述的“偏移”机制。如果这一切是真的的话,那么提高认识就是唯一的解决方案了,同时还要在客户端上做出修改,以明确主公钥特性和层级式钱包特性不要一起使用。

可能还有一种可以绕过这一漏洞的方法:制造三个层级式BIP32钱包,沿着特定的子密钥衍生路径生成所有地址,每个地址都是这三个钱包的2-of-3合成签名地址(译者注:也就是说3把私钥中任意2把私钥组合在一起才可签名发币)。然后,审计员可以拿着三把主公钥中的一把,并在区块链中搜索所有的脚本中包含了从那把主公钥生成的所有公钥的交易。这一解决方案很复杂,不为现有的任何客户端所支持,并且远不完美,但像这样的方法是避开这一漏洞的唯一途径了。在大多数情况下,干脆不放出主公钥可能是更好的方法。

所以,确定性钱包的前景如何?在目前来看,BIP0032可以说是到此为止了;一个重要升级可能是BIP0032合成签名钱包,它把BIP0032 的层级式确定性魔法和一个比特币的高级特性(3把私钥中任意2把私钥组合在一起才可签名发币)结合在了一起。未来的另一个方向是脑钱包。记忆住比特币钱包有两大途径:1.选择一个密码,并使用这一密码或者密码的哈希值作为种子;2.随机生成一个种子,并把这个种子通过一种可以逆转的方式转换成一串密语。这两种途径的实现,在目前来看都有某些程度的缺陷——第一种方法的标准实现方式,对暴力破解的耐受力不强,然而第二种方法的标准(Electrum)实现方式有太难以记住了——研究表明像“glow date cost bloody curve wheel cousin picture ring finally bubble press”这样的密语(译注:这串密语是一堆单词的无意义堆砌),并不比相当安全级别的随机字符串要更容易被记住,并且它们不能在忘记其中一两个单词的情况下找回钱包。这些都是公开的问题——如果你是一名比特币开发者,你有机会提出解决方案并让它成为标准答案。

原文 http://bitcoinmagazine.com/8396/deterministic-wallets-advantages-flaw/

作者 Vitalik Buterin

翻译 He1l_Q

本文如有帮助,请考虑捐助:15X9AMhccjqqPRkhpgraoj7fgdqymW3iSC

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

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们100@7234.cn

    参与讨论 (0 人参与讨论)

    相关推荐

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    区块链投资趋势报告:巨头入场布局行业趋于成熟

    来自:https://mp.weixin.qq.com/s?__biz=MzI4NzIxOTY1NA==&mid=2650632639&idx=1&sn=e6d1c29731d992a80410aaee82ec3ea6&chksm=f3d8db16c4af520097e4a64a71b1d4743ac326b9f027

    重新发明货币

    重新发明货币

    一、货币的演化过程 先简单回顾一下人类货币的演化过程,大概有以下阶段: a. 1.0版本:自然货币(贝壳、牲口、金银……) 这个阶段,货币基于一般等价物的稀有性或者实用性,货币不可能出现人为操纵的超发。 b. 2.0版本:早期纸币、银票到本位纸币 当贸易量越来越大,实物货币太不方便了,而且大家发现其实并不在意货币本身有什么价值,在意的只是这么多的货币能不能交换到足够的物品,于是纸币这种信用货

    从比特币交易看欧洲央行虚拟货币分类

    从比特币交易看欧洲央行虚拟货币分类

      互联网对传统社会的颠覆从未停止,在其完成对信息流、商流、物流、资金流的初步改造之后,或将以虚拟货币的形式打破现有货币体系   4月18日,在中国极客张沈鹏创办的比特币交易平台(42BTC.com)上,比特币对人民币的平均交易价为576元。当天,该平台完成了100个比特币的交易量。仅仅过去一周,4月25日上午,比特币对人民币的平均交易价已达到906元。据42BTC网站统计:在过去的32个月

    欧洲央行-比特币报告

    3.1 比特币 3.1.1 基本特征          比特币可能是最成功的,也可能是最有争议的虚拟货币方案,由日本程序员中本聪(译者注:事实上,中本聪是不是日本人,甚至是不是单个人无从考证)在2009年设计并实现。该计划基于一个类似于BitTorrent的P2P网络。BitTorrent是互联网上著名的共享文件协议,应用在电影,游戏和音乐领域。比特币在全球层面上运作,可用于各类货币交易(虚

    彻底玩转比特币地址和私匙

    彻底玩转比特币地址和私匙

    比特币地址和私匙是所有比特币初学者面对的一大难题,再加上那一串超长的字符串,让人更是摸不到头脑。 现在编者以问答的形式,带你一步步的揭开比特币地址和私匙的面纱。 还不知道什么是比特币地址和私匙的同学请点这里 问题一、比特币钱包由什么组成? 答 我们知道,比特币地址和私匙组成了比特币钱包,而私匙则决定了比特币地址上比特币的归属。 地址和私匙 问题二、如果只记得私匙我们还能还原比特币地址么? 答

    用GO语言实现比特币算法

    用GO语言实现比特币算法

    本节的这个例子展示一点点高精度数学包math/big、一点点散列包hash、一点点加密包crypto,还有一点点测试包testing的知识。这里不介绍bitcoin协议和算法——尽管它们很有趣,而是试图指出,Go对多种操作系统的支持,是实现这种跨平台应用的理想语言。 位钱(bitcoin)是一种使用加密手段制作的分布式电子货币。它最初于1998年由Wei Dai提出,并由中本聪(Satoshi

    详解比特币的找零机制

    详解比特币的找零机制

    比特币的找零机制一直让人有些迷惑,明明只向一个地址发送了比特币为什么 blockchain 上面的显示的有时是1个地址对多个地址,有时是多个地址对1个地址,有时又显示多个地址对多个地址? 为什么比特币资深用户要提醒大家当比特币钱包交易100次以上时再次交易后要重新备份钱包,恢复以前的钱包备份有可能会遭遇损失? 是的,这一切都是因为比特币的找零(Change)机制。本文参考 Bitcoin的维

    玩转比特币客户端之一:C盘转移和加速下载

    玩转比特币客户端之一:C盘转移和加速下载

    C盘空间不足?交易数据下载速度太慢?别着急,乐享比特币教你轻松玩转比特币官方客户端。 所有新人开始接触比特币时做的第一件事情大多数是安装比特币的官方客户端。 安全起见大家最好直接访问官方发布渠道sourceforge的地址进行下载:http://sourceforge.net/projects/bitcoin/files/Bitcoin/ 该网页列出了各版本的官方比特币客户端,目前

    麦妖榜
    更新日期 2019-06-19
    排名用户贡献值
    1BitettFan24007
    2等待的宿命23809
    3六叶树20309
    4区块大康18727
    5牛市来了16781
    6天下无双16192
    7linjm122716073
    8lizhen00215114
    9让时间淡忘14475
    10冷风大q11188
    返回顶部 ↑