首页 百科知识 高级密钥和地址

高级密钥和地址

时间:2022-07-17 百科知识 版权反馈
【摘要】:在本节中,我们将观察密钥和地址的高级形式,比如加密私钥、脚本和多签名地址、荣耀地址,以及纸钱包。这个提案由比特币改进提案38号标准化,被称为BIP0038。表4.10 BIP0038加密私钥示例正如我们所了解的,传统比特币地址是以数字“1”开头的,从公钥计算得来,而公钥又是从私钥派生而来的。

在本节中,我们将观察密钥和地址的高级形式,比如加密私钥、脚本和多签名地址、荣耀地址,以及纸钱包。

私钥必须一直保持私密。私钥的保密性要求在实践中是很难实现的,因为它与同等重要的安全目标——可用性,形成了直接冲突。当你需要保存私钥的备份以防丢失时,如何保证其私密性则更为困难。将私钥保存在钱包中,并通过密码加密会安全一些,但是这样钱包就需要进行备份。时不时地,用户可能还需要将密钥从一个钱包转移到另一个钱包——比如为了升级或者更换钱包软件。私钥备份可能也需要保存在纸上(参见本章中“纸钱包”),或者一个外置存储介质上,比如U盘。但是假如备份被盗或者丢失呢?这些冲突的安全目标,推动了一个私钥加密提案的诞生,它便携、方便,可以被不同的钱包和比特币客户端所理解。这个提案由比特币改进提案38号标准化,被称为BIP0038。

BIP0038提出了使用密码加密私钥,并进行Base58Check编码的标准,该标准保证密钥可以在备份介质上安全存储、在不同钱包间安全转移、在任何可能导致密钥泄露的场合保存。这个加密标准使用高级加密标准(AES),AES标准是美国国家标准技术研究所(NIST)创立的,广泛应用于商业及军事领域的数据加密。

BIP0038加密方案以一个比特币私钥作为输入,私钥通常以钱包导入格式(WIF)编码,是一个使用Base58Check编码,并带前缀“5”的字符串。另外,BIP0038提案还需要一个长密码——由多个单词或者包含数字字母的复杂字符串。BIP0038提案的结构是一个Base58Check编码的加密私钥,以前缀“6P”开头。如果你看到一个密钥以“6P”开头,意味着它是一个加密的密钥,需要密码才能将其转换(解密)成为可以在钱包中使用的WIF格式的私钥(前缀为“5”)。很多钱包软件现在已经支持BIO0038加密私钥,会提示用户输入密码以便解密并导入。一些第三方应用,比如一款特别好用的基于浏览器的“Bit Address”(http://bitaddress.org)(在其“Wallet Details”选项卡中)就可用于解密BIP0038密钥。

BIP0038加密密钥最常用的案例是使用纸钱包,纸钱包用于在纸张上备份私钥。一旦用户选择了足够强大的密码,一个带BIP0038加密密钥的纸钱包将会非常安全,是比特币离线存储的极好选择(这也被称为“冷存储”)。

对表4.10中列出的加密密钥,可以使用bitaddress.org进行测试,了解如何通过输入密码得到解密密钥。

表4.10 BIP0038加密私钥示例

正如我们所了解的,传统比特币地址是以数字“1”开头的,从公钥计算得来,而公钥又是从私钥派生而来的。虽然任何人都可以往一个“1”开头的比特币地址发送比特币,但是只有能提供与公钥哈希相对应的私钥,并进行签名的人,才能花费这笔比特币。

以“3”开头的比特币地址是支付到脚本哈希(Pay-To-Script Hash,简称P2SH)地址,有时也被错误地称作多重签名(multi-signature或multi-sig)地址。这种地址指定交易的受益人是一个脚本的哈希,而不是某个公钥的所有者。这项功能于2012年1月以BIP0016提案的形式引进,它为比特币地址本身提供了更多的功能,因此被广泛采纳。不像发送资金到“1”开头比特币地址[也被称为“支付到公钥哈希”(P2PKH)]的普通交易,发送资金到“3”开头地址,除了需要公钥哈希和作为所有权证明的私钥签名,还需要更多的东西。这些要求在地址创建时就在脚本中被指定,所有以这个地址作为目标的交易输入都会被这些要求所限制。一个发送到脚本哈希的地址是从一个交易脚本中创建的,它定义了谁可以花费这个交易输出[更详细的说明,参见第5章“支付到脚本哈希(P2SH)”]。编码一个支付到脚本哈希的地址,需要使用与创建比特币地址相同的双重哈希函数,只是它作用于脚本上而不是公钥上。

所产生的“脚本哈希”加上版本前缀“5”,并以Base58Check格式编码,得到一个以3开头的编码地址。这是一个P2SH地址的范例:

32M8ednmuyZ2zVbes4puqe44NZumgG92sM

1P2SH不必与多重签名标准的交易相同。一个P2SH地址常常表示一个多重签名脚本,但它也可以表示其他类型交易的脚本编码。

目前,P2SH实现的功能大多是多重签名地址脚本,就像其名称所暗示的,底层脚本要求超过一个的签名来证明所有权并花费资金。比特币多重签名功能的设计要求在N个密钥中,至少需要提供M个签名(被称为“阈值”),被称为M-of-M多重签名,这里M小于或等于N。举例来说,咖啡店老板鲍勃(第1章介绍的)可以使用一个多重签名地址,要求进行1-of-2签名,其中一个密钥来自鲍勃,另一个来自他妻子,以确保他们中的任何一个都可以签名花费被这个地址锁定的交易输出。这与传统银行提供的“联合账户”功能类似,联合账户允许夫妻中的任何一人签名即可使用资金。再例如,高佩什——那个为鲍勃设计网站的设计师,可以为其业务创建一个2-of-3签名地址,确保至少两个业务合作伙伴对交易签名后,才能花费发送到该地址的资金。

我们在第5章中将探索如何创建一个交易,以花费从P2SH(以及多重签名)地址接收到的资金。

荣耀地址是一种包含人工可读信息的有效比特币地址。比方说1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33就是一个有效地址,它包含了英文单词“Love”,并作为Base-58字符的前面4位。创建一个荣耀地址往往需要尝试数十亿的候选私钥,直到找到一个能生成指定模式地址的私钥。虽然也有一些生成荣耀地址的优化算法,但是归根结底,其过程都是随机选择一个私钥,生成公钥,并由此生成地址,最后检查地址是否满足荣耀需求,重复这个过程直到找到匹配的选择项。

一旦找到一个与期望模式匹配的荣耀地址,与之相应的私钥就可用于花费比特币,这与其他地址完全一样。荣耀地址与普通地址相比没有任何区别。它们基于相同的椭圆曲线密码学(ECC)和安全哈希算法(SHA)。想通过荣耀地址查找私钥其难度也与普通地址一样。

在第1章中,我们介绍过尤金妮娅,一个菲律宾儿童慈善机构的负责人。假设尤金妮娅要举办一个比特币的募捐活动,她想公布荣耀地址作为募捐地址。尤金妮娅创建了一个以“1Kids”开头的比特币地址,用于募捐宣传。下面我们来看看这个荣耀地址是如何创建的,以及这个地址对于尤金妮娅的慈善机构又意味着什么。

首先,我们必须认识到比特币地址只是一个简单的数字,以Base58字符编码表示。为了找到“1Kids”开头的地址,可以看作从1Kids11111111111111111111111111111到1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzz中随便找到一个。则总共约有5829(约等于1.4×1051)个地址,都是以“1Kids”开头。表4.11显示了以1Kids开头的地址范围。

表4.11 以“1Kids”开头的荣耀地址范围

我们把模式“1Kids”看作一个数字,看一下在比特币地址里找到这个模式的频率(参看表4.12)。一台不带特殊硬件的台式电脑,每秒大概可以进行100000次密钥搜索。

表4.12 出现荣耀模式(1KidsCharity)的频率及在台式电脑上平均消耗时间

就像你所看到的,尤金妮娅不可能马上创建“1KidsCharity”这样的地址,即使她能同时控制几千台计算机也难以做到。任意增加一个字符,难度就会增加58倍。超过7个字符的模式一般只能通过特定的硬件找到,比如定制的带有多块图形处理单元(GPUs)的电脑。这些电脑通常是比特币“矿机”再利用的产物,这些“矿机”用作挖矿已经无利可图,但是用来查找荣耀地址还是可行的。在GPU系统上查找荣耀地址要比使用通用的CPU快很多数量级。

查找荣耀地址的另外一种方式是外包给荣耀矿池,比如“Vanity Pool”矿池(http://vanitypool.appspot.com)。矿池是那些拥有GPU硬件的人所提供的一种服务,他们通过帮助别人查找荣耀地址挣取比特币。通过支付一笔很小的资金(0.01比特币,在写本书时大概相当于5美元),尤金妮娅就可以通过外包搜索得到一个7位数的荣耀地址,这个过程仅需几个小时,而如果自己用CPU计算的话,则需要花上几个月时间。

创建荣耀地址是一种暴力破解过程:尝试一个随机密钥,检查它的地址是否与目标模式匹配,不断重复直到成功。例4-8列出了一个“荣耀地址矿工”的范例,它是一个基于C++语言的、用于查找荣耀地址的程序。例子使用了我们在第3章“替代客户端、库、工具集”中介绍过的libbitcoin库。

示例代码必须使用C编译器进行编译,并与libbitcoin库连接(库必须预先安装在系统上)。运行示例时,只要运行vanity-miner++可执行程序,不需任何参数(参看例4-9),程序将尝试找到一个“1Kids”开头的地址。

示例代码需要花费数秒钟找到一个匹配3个字符模式“Kid”的结果,当使用Unix的time命令时我们就可以看到执行时间。你可以在源码中修改搜索模式,看看搜索4个甚至5个字符的模式需要多长时间。

荣耀地址是一把双刃剑,既可以用于增强可以削弱安全性。在提高安全性方面,一个与众不同的地址使入侵者难以将你的地址替换成他们的地址,以欺骗你的客户向他们付款。不幸的是,荣耀地址使得任何人都可以创建一个类似于随机地址的地址,或者另一个荣耀地址,以此欺骗你的客户。

尤金妮娅可以向愿意捐款的人宣布一个随机生成的地址(比如:1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy),或者她也可以生成一个以1Kids开头的易于识别的荣耀地址。

不管是哪种方式,均面临同样的威胁,在使用固定地址(而不是每个捐赠人一个独立的动态地址)的情况下,一旦有人侵入网站,并将这个地址替换为他自己的地址,捐赠人的资金将被转入他的账户。如果你通过不同的渠道发布捐赠地址,你的客户可以在确定支付前直观地检查这个地址,它是否与公布信息的网站、电子邮箱或者传单上所发布的地址相同。如果是一个随机地址,就像1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy这样,大部分客户可能会比对前面几个字符,比如1J7mdg,如果相同则认为地址是一样的。而那些有意盗取资金的入侵者,可以使用一个荣耀地址生成器,生成一个前面几位字符相同的替代地址,看起来与这个地址很接近,如表4.13所示的。

表4.13 生成与随机地址类似的荣耀地址

那么荣耀地址能增强安全性吗?如果尤金妮娅生成一个荣耀地址1Kids33q44erFfpeXrmDSz7zEqG2FesZEN,客户很可能就会比对荣耀模式和其后的几个字符,比如“1Kids33”。这就使得攻击者必须至少生成6个字符(多2个字符),这将比尤金妮娅查找4位荣耀地址所花的时间多出3364倍(58×58)。最重要的,尤金妮娅付出的努力(或者向荣耀地址矿池交付的资金)使得攻击者不得不生成更长的荣耀地址。如果尤金妮娅缴费让荣耀地址矿池生成一个8个字符的荣耀地址,攻击者将不得不创建10个字符长度的荣耀地址,这在普通电脑上已无法完成;如果采用荣耀地址挖矿机或者荣耀地址矿池,也是极为昂贵的。尤金妮娅可承受的费用到了攻击者这边就变得难以承受了,特别是如果潜在的回报无法覆盖生成荣耀地址所需要花费的费用时。

纸钱包就是将比特币私钥印制在纸张上。通常,出于方便起见,纸钱包也包含相应的比特币地址,不过这不是必需的,因为地址可以从私钥派生而来。纸钱包是一个非常高效的创建备份或离线比特币存储的手段,也被称为“冷存储”。作为一个备份机制,纸钱包可以提供足够的安全手段,防止因为计算机灾难造成的私钥丢失,比如硬盘失效、被盗或者意外删除。作为一种“冷存储”机制,如果纸钱包的密钥是离线生成,且从未在计算机系统上存储过,那么它们在对抗黑客、键盘记录,以及其他在线威胁方面更具安全性。

纸钱包可以有不同的形状、尺寸和外观设计,但是本质就是将密钥和地址打印在纸张上。表4.14显示了一个形式最简单的纸钱包。

表4.14 形式最简单的纸钱包——打印出来的比特币地址和私钥

使用一些工具,比如bitaddress.org上客户栏的JavaScript生成器,可以简便地生成纸钱包。这个页面包含生成私钥和纸钱包所必需的所有代码,即使与互联网完全断开,也不影响其使用。为了使用这个工具,要将HTML页面保存到本地硬盘或者外置U盘上,然后断开与互联网的连接,在浏览器中打开刚才保存的文件。更安全的做法是启动一个干净的操作系统,比如一个CD-ROM启动的干净Linux系统,来使用这个工具。这个工具在离线状态下生成的任何密钥,均能通过USB线(不是无线)在本地打印机上打印出来。这样,创建的纸钱包密钥只在本地纸张上存在,而不会在任何在线系统上存储。将纸钱包存在一个防火的保险箱内,发送比特币到它们对应的地址,一个简单但是高效的“冷存储”方案就实现了。图4.14显示了一个通过bitaddress.org网站生成的纸钱包。

图4.14 通过bitaddress.org生成的简单纸钱包

简单纸钱包系统的缺点是打印的密钥容易被贼盯上。一个能接触到纸钱包的贼,既可以把那张纸偷走,也可以把密钥拍下来,从而控制被这些密钥所控制的比特币。更复杂的纸钱包存储系统采用BIP0038加密密钥。打印在纸钱包上的密钥受密码保护,而这个密码只在主人的脑袋里记着。没有密码,加密密钥毫无用处。不管怎样,纸钱包仍然比密码保护的钱包更安全,因为这些密钥从未在线,并且必须通过物理的方式从保险柜或者其他物理安全的存储设备上取得。图4.15显示了一个在bitaddress.org上生成的使用加密密钥(BIP0038)的纸钱包。

图4.15 通过bitaddress.org生成的加密钱包,密码是“test”

2虽然你可以往一个纸钱包上多次存入资金,但是你必须一次性地用掉所有资金。这是因为在解锁和使用资金的过程中,你已经暴露了密钥,同样也因为当你花费的金额少于全部金额时,有些钱包应用会自动创建找零地址。解决这个问题的一种方案是,一次性地取出纸钱包地址上的所有余额,将剩余部分发送到另外一个新的纸钱包中。

纸钱包具有不同的设计方案和尺寸,也拥有不同的功能。有些设计方案用来作为礼物送给别人,因此设计了季节主题、比如圣诞主题、元旦主题等;另外一些则存在银行金库或者保险柜中,密钥需要通过某些方式进行隐藏,比如覆盖不透明的贴纸,折叠并使用防篡改黏合箔密封,等等。图4.16到图4.18是一系列带有安全保护和备份功能的不同的纸钱包。

图4.16 通过bitcoinpaperwallet.com生成的纸钱包,密钥打印在折叠翼片上

另外一种设计方案,支持额外的密钥和地址的备份,形式上是一个附加的存根,类似票根,允许存储多个副本以达到防火防水及其他自然灾害的目的。

图4.17 通过bitcoinpaperwallet.com生成的纸钱包,密钥被密封隐藏

图4.18 具有额外密钥副本的纸钱包,印制在备份“存根”上

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈