比特币之钱包

作者: CodingCattwo | 来源:发表于2018-11-19 23:38 被阅读3次

    钱包技术概述

    比特币钱包只含有密钥,而不是钱币。 每个用户有一个包含多个密钥的钱包。 钱包只包含私钥/公钥对的密钥链。

    用户用密钥签名交易,从而证明他们拥有交易输出(他们的钱币)。 钱币以交易输出的形式存储在区块链中(通常记为vout或txout)。

    有两种主要类型的钱包,区别在于它们包含的多个密钥是否相互关联。

    1. 第一种类型是非确定性钱包(nondeterministic wallet),其中每个密钥都是从随机数独立生成的。密钥彼此无关。这种钱包也被称为“Just a Bunch Of Keys(一堆密钥)”,简称JBOK钱包。

    2. 第二种类型是确定性钱包(deterministic wallet),其中所有的密钥都是从一个主密钥派生出来,这个主密钥即为种子(seed)。该类型钱包中所有密钥都相互关联,如果有原始种子,则可以再次生成全部密钥。确定性钱包中使用了许多不同的密钥推导方法。最常用的推导方法是使用树状结构,称为分级确定性钱包或HD钱包。

    确定性钱包由种子衍生创造。为了便于使用,种子被编码为英文单词,也称为助记词。

    非确定性(随机)钱包

    在最早的一批比特币客户端中( Bitcoin Core,现在称作比特币核心客户端),钱包只是随机生成的私钥集合。这种类型的钱包被称作零型非确定钱包。举个例子,比 特币核心客户端预先生成100个随机私钥,从最开始就生成足够多的私钥并且每个密钥只使用一次。这种钱包现在正在被确定性钱包替换,因为它们难以管理、 备份以及导入。随机密钥的缺点就是如果你生成很多私钥,你必须保存它们所有的副本。这就意味着这个钱包必须被经常性 地备份。每一个密钥都必须备份,否则一旦钱包不可访问时,钱包所控制的资金就付之东流。这种情况直接与避免地址重复使用的原则相冲突——每个比特币地址只能用一次交易。地址重复使用将多个交易和地址关联在一起,这会减少隐私。当你想避免重复使用地址时,零型非确定性钱包并不是好的选择,因为你要创造过多的私钥并且要保存它们。虽然比特币核心客户端包含零型钱包,但比特币的核心开发者并不鼓励大家使用。

    image

    确定性(种子)钱包

    确定性,或者“种子”钱包包含通过使用单项离散函数而可从公共的种子生成的私钥。种子是随机生成的数字。这个数字也含有比如索引号码或者可生成私钥的“链码”(参见“ 分层确定性钱包”)。在确定性钱包中,种子足够恢复所有的已经产生的私钥,所以只用在初始创建时的一个简单备份就足以搞定。并且种子也足够让钱包导入或者导出。这就很容易允许使用者的私钥在钱包之间轻松转移。

    图5-2展示了确定性钱包的逻辑图。


    image

    分层确定性钱包(HD Wallets (BIP-32/BIP-44))

    确定性钱包被开发成更容易从单个“种子”中生成许多密钥。确定性钱包的最高级形式是通过BIP0032标准定义的HD钱包。HD钱包包含以树状结构衍生的密钥,使得父密钥可以衍生一系列子密钥,每个子密钥又可以衍生出一系列孙密钥,以此类推,无限衍生。图5-3展示了树状结构。

    image

    相比较随机(不确定性)密钥,HD钱包有两个主要的优势。

    1. 第一,树状结构可以被用来表达额外的组织含义。比如当一个特定分支的子密钥被用来接收交易收入并且有另一个分支的子密钥用来负责支付花费。不同分支的密钥都可以被用在企业环境中,这就可以支配不同的分支部门、子公司、具体功能以及会计类别。

    2. HD钱包的第二个好处就是它可以允许让使用者去建立一个公共密钥的序列而不需要访问相对应的私钥。这可允许HD钱包在不安全的服务器中使用或者在每笔交易中发行不同的公共钥匙。公共钥匙不需要被预先加载或者提前衍生,而在服务器中不需要可用来支付的私钥。

    种子和助记词(BIP-39)

    HD钱包具有管理多个密钥和地址的强大机制。由一系列英文单词生成种子是个标准化的方法,这样易于在钱包中转移、导出和导入,如果HD钱包与这种方法相结合,将会更加有用。 这些英文单词被称为助记词,标准由BIP-39定义。 今天,大多数比特币钱包(以及其他加密货币的钱包)使用此标准,并可以使用可互操作的助记词导入和导出种子进行备份和恢复。

    让我们从实际的角度来看以下哪种种子更容易抄录、阅读、导出以及导入。

    16进制表示的种子: 0C1E24E5917779D297E14D45F14E1A1A

    助记词表示的种子:
    army van defense carry jealous true garbage claim echo media make crunch

    从助记词生成种子

    助记词表示长度为128至256位的熵。 通过使用密钥延伸函数PBKDF2,熵被用于导出较长的(512位)种子。将所得的种子用于构建确定性钱包并得到其密钥。

    密钥延伸函数有两个参数:助记词和盐。其中盐的目的是增加构建能够进行暴力攻击的查找表的困难度。 在BIP-39标准中,盐具有另一目的,它允许引入密码短语(passphrase),作为保护种子的附加安全因素,我们将在BIP-39可选密码短语章节详细地描述。

    创建助记词之后的7-9步是:

    7、PBKDF2密钥延伸函数的第一个参数是从步骤6生成的助记符。

    8、PBKDF2密钥延伸函数的第二个参数是盐。 由字符串常数“助记词”与可选的用户提供的密码字符串连接组成。

    9、PBKDF2使用HMAC-SHA512算法,使用2048次哈希来延伸助记符和盐参数,产生一个512位的值作为其最终输出。 这个512位的值就是种子。

    图5-7显示了从助记词如何生成种子

    seed

    BIP-39中的可选密码短语

    BIP-39标准允许在推导种子时使用可选的密码短语。 如果没有使用密码短语,助记词是用由常量字符串“助记词”构成的盐进行延伸,从任何给定的助记词产生一个特定的512位种子。 如果使用密码短语,密钥延伸函数使用同样的助记词也会产生不同的种子。事实上,给予一个单一的助记词,每一个可能的密码短语都会导致不同的种子。 基本上没有“错误”的密码短语, 所有密码短语都是有效的,它们都会导致不同的种子,形成一大批可能未初始化的钱包。这批钱包非常之大(2^512),使用暴力破解或随机猜测基本不可能。

    提示BIP-39中没有“错误的”密码短语。 每个密码都会导致一些钱包,只是未使用的钱包是空的。

    可选密码短语带来两个重要功能:

    • (存储在大脑中的)密码短语成为第二个因素,使得助记词不能单独使用,避免了助记词备份盗取后被利用。 起到掩人耳目的效果,把密码短语指向有小额资金的钱包,分散攻击者注意力,使其不在关注拥有大额资金的“真实”钱包。

    然而,需要注意的是,使用密码短语也会引起丢失的风险:

    • 如果钱包所有者无行为能力或死亡,没有人知道密码,种子是无用的,所有存储在钱包中的资金都将永远丢失。相反,如果所有者将密码短语与种子备份在相同的地方,则违反了上述第二个因素的目的。虽然密码是非常有用的,但它们只能与仔细计划的备份和恢复流程结合使用,考虑到所有者个人风险的可能性,应该允许其家人恢复加密资产。

    钱包标准

    由于比特币钱包技术已经成熟,出现了一些常见的行业标准,使得比特币钱包具备广泛互操作,易于使用,安全和灵活的特性。这些常用的标准是:

    1. 助记码,基于BIP-39
    2. HD钱包,基于BIP-32
    3. 多用途HD钱包结构,基于BIP-43
    4. 多币种和多帐户钱包,基于BIP-44

    这些标准可能会随着发展而改变或过时,但是现在它们形成了一套互锁技术,这些技术已成为比特币的事实上的钱包标准。

    扩展与衍生密钥

    私有子密钥的衍生

    分层确定性钱包使用CKD(child key derivation)函数去从母密钥衍生出子密钥。

    子密钥衍生函数是基于单项哈希函数。这个函数结合了:

    • 一个母私钥或者公共钥匙(ECDSA未压缩键)

    • 一个叫做链码(256 bits)的种子

    • 一个索引号(32 bits)

    链码是用来给这个过程引入确定性随机数据的,使得索引不能充分衍生其他的子密钥。因此,有了子密钥并不能让它发现自己的姊妹密钥,除非你已经有了链码。最初的链码种子(在密码树的根部)是用随机数据构成的,随后链码从各自的母链码中衍生出来。

    这三个项目(母私钥,链码,索引)相结合并散列可以生成子密钥。向密码树下一层重复这个过程,每个子密钥可以依次成为母密钥继续创造它自己的子密钥,直到无限代。

    扩展密钥

    正如我们之前看到的,密钥衍生函数可以被用来创造密钥树上任何层级的子密钥。这只需要三个输入量:一个密钥,一个链码以及想要的子密钥的索引。密钥以及链码这两个重要的部分被结合之后,就叫做扩展密钥(extended key)。术语“extended key”也被认为是“可扩展的密钥”,因为这种密钥可以用来衍生子密钥。

    扩展密钥可以简单地被储存并且表示为简单的将256位密钥与256位链码所并联的512位序列。有两种扩展密钥。扩展的私钥是私钥以及链码的结合。它可被用来衍生子私钥(子私钥可以衍生子公钥)。公钥以及链码组成扩展公钥,它可以用来扩展子公钥,见“生成公钥”章节。

    想象一个扩展密钥作为HD钱包中密钥树结构的一个分支的根。你可以衍生出这个分支的剩下所有部分。扩展私钥可以创建一个完整的分支,而扩展公钥只能够创造一个公钥的分支。

    提示一个扩展密钥包括一个私钥(或者公钥)以及一个链码。一个扩展密钥可以创造出子密钥并且能创造出密钥树结构中的整个分支。分享扩展密钥就可以访问整个分支。

    公共子密钥推导

    正如之前提到的,分层确定性钱包的一个很有用的特点就是可以不通过私钥而直接从公共母密钥派生出公共子密钥的能 力。这就给了我们两种衍生子公钥的方法:或者通过子私钥,再或者就是直接通过母公钥。

    因此,扩展密钥可以在HD钱包结构的分支中,被用来衍生所有的公钥(且只有公钥)。

    这种快捷方式可以用来创造非常保密的只有公钥配置。在配置中,服务器或者应用程序不管有没有私钥,都可以有扩展公钥的副本。这种配置可以创造出无限数量的公钥以及比特币地址。但是发送到这个地址里的任何比特币都不能使用。与此同时,在另一种更保险的服务器上,扩展私钥可以衍生出所有的对应的可签署交易以及花钱的私钥。

    • 这种方案的常见应用是安装扩展公钥电商的网络服务器上。网络服务器可以使用这个公钥衍生函数去给每一笔交易(比如客户的购物车)创造一个新的比特币地址。但为了避免被偷,网络服务商不会有任何私钥。没有HD钱包的话,唯一的方法就是在不同的安全服务器上创造成千上万个比特币地址,之后就提前上传到电商服务器上。这种方法比较繁琐而且要求持续的维护来确保电商服务器不“用光”公钥。

    • 这种解决方案的另一种常见的应用是冷藏或者硬件钱包。在这种情况下,扩展的私钥可以被储存在纸质钱包中或者硬件设备中(比如 Trezor 硬件钱包),与此同时扩展公钥可以在线保存。使用者可以根据意愿创造“接收”地址而私钥可以安全地在线下被保存。为了支付资金,使用者可以使用扩展的私钥离线签署比特币客户或者通过硬件钱包设备(比如 Trezor)签署交易。

    图5-11阐述了扩展母公钥来衍生子公钥的传递机制。


    image

    相关文章

      网友评论

        本文标题:比特币之钱包

        本文链接:https://www.haomeiwen.com/subject/rglpaftx.html