区块链-高级密钥和地址

目录:http://www.javashuo.com/article/p-nitsjfvy-ey.html算法

摘自《精通比特币》浏览器

 一、加密私钥(BIP0038)

私钥必须保密。私钥的机密性需求状况是,在实践中至关难以实现,由于该需求与一样重要的安全对象可用性相互矛盾。当你须要为了不私钥丢失而存储备份时,会发现维护私钥私密性是一件至关困难的事情。安全

经过密码加密存有私钥的钱包可能要安全一点,但那个钱包也须要备份。有时,例如用户由于要升级或重装钱包软件,而须要把密钥从一个钱包转移到另外一个。私钥备份也可能须要存储在纸张上或者外部存储介质里,好比U盘。但若是一旦备份文件失窃或丢失呢?这些矛盾的安全目标推动了便携、方便、能够被众多不一样钱包和比特币客户端理解的加密私钥标准BIP0038的出台。网络

BIP0038 提出了一个通用标准,使用一个口令加密私钥并使用 Base58Check对加密的私钥进行编码,这样加密的私钥就能够安全地保存在备份介质里,安全地在钱包间传输,保持密钥在任何可能被暴露状况下的安全性。这个加密标准使用了AES,这个标准由 NIST 创建,并普遍应用于商业和军事应用的数据加密。函数

IP0038 加密方案是:输入一个比特币私钥,一般使用WIF编码过,base58chek 字符串的前缀“5”。此外 BIP0038 加密方案须要一个长密码做为口令,一般由多个单词或一段复杂的数字字母字符串组成。BIP0038 加密方案的结果是一个由 base58check 编码过的加密私钥,前缀为 6P。若是你看到一个 6P 开头的的密钥, 这就意味着该密钥是被加密过,并须要一个口令来转换(解码)该密钥回到可被用在任何钱包 WIF 格式的私钥(前缀为 5)。许多钱包 APP 如今可以识别 BIP0038工具

加密过的私钥,会要求用户提供口令解码并导入密钥。第三方APP, 诸如很是好用基于浏览器的 BitAddress , 能够被用来解码 BIP00038 的密钥。性能

最一般使用 BIP0038 加密的密钥用例是纸钱包——一张纸张上备份私钥。只要用 户选择了强口令,使用 BIP0038 加密的私钥的纸钱包就无比的安全,这也是一种很棒的比特币离线存储方式(也被称做“冷存储”)。测试

二、P2SH (Pay-to-Script Hash)和多重签名地址

正如咱们所知,传统的比特币地址从数字1开头,来源于公钥,而公钥来源于私钥。虽然任何人均可以将比特币发送到 一个 1 开头的地址,但比特币只能在通 过相应的私钥签名和公钥哈希值后才能消费。优化

以数字3开头的比特币地址是 P2SH 地址,有时被错误的称谓多重签名或多重签 名地址。他们指定比特币交易中受益人为哈希的脚本,而不是公钥的全部者。这 个特性在 2012 年 1 月由 BIP0016 引进,目前由于 BIP0016 提供了增长功能到地址 自己的机会而被普遍的采纳。不一样于 P2PKH 交易发送资金到传统 1 开头的比特币 地址,资金被发送到 3 开头的地址时,须要的不只仅是一个公钥的哈希值和一个 私钥签名做为全部者证实。在建立地址的时候,这些要求会被指定在脚本中,所 有对地址的输入都会被这些要求阻隔。网站

一个 P2SH 地址从交易脚本中建立,它定义谁能消耗这个交易输出(后面“P2SH (Pay-to-Script-Hash)”一节对此有 详细的介绍)。编码一个 P2SH 地址涉及使用 一个在建立比特币地址用到过的双重哈希函数,而且只能应用在脚本而不是公钥:

                                                 scripthash=RIPEMD160(SHA256(script))

产生的脚本哈希由 Base58Check 编码前缀为 5 的版本、编码后获得开头为 3 的编 码地址。一个 P2SH 地址例子是 3F6i6kwkevjR7AsAd4te2YB2zZyASEm1HM。可使 用 BitcoinExplorer 命令脚本编码得到,好比 sha256,ripemd160,and base58check-encode。

三、多重签名地址和 P2SH

目前,P2SH 函数最多见的实现是多重签名地址脚本。顾名思义,底层脚本须要多 个签名来证实全部权,此后才能消费资金。设计比特币多重签名特性是须要从总 共 N 个密钥中须要 M 个签名(也被称为“阈值”),被称为 M-N 多签名,其 中 M 是等于或小于 N。这相似于传统的银行中的一个“联合帐户”,其 中任何一方配偶能够单独签单消费。或就像 Bob 雇佣的网页设计师 Gopesh, 创立一个网站,可能为他的业务须要一个 2-3 的多签名地址,确保除非至少两个业务合做伙伴签署签名交易才能够进行支付消费。

四、比特币靓号地址

靓号地址包含了人类可读信息的有效比特币地址。例如, 1LoveBPzzD72PUXLzCkYAtGFYmK5vYNR33 就是包含了 Base-58 字母 love 的。靓号 地址须要生成并经过数十亿的候选私钥测试,直到一个私钥能生成具备所需图案的比特币地址。虽然有一些优化过的靓号生成算法,该方法必须涉及随机上选择 一个私钥,生成公钥,再生成比特币地址,并检查是否与所要的靓号图案相匹配, 重复数十亿次,直到找到一个匹配。

一旦找到一个匹配所要图案的靓号地址,来自这个靓号地址的私钥能够和其余地 址相同的方式被拥有者消费比特币。靓号地址不比其余地址具备更多或更少的安 全性。它们依靠和其余地址相同的 ECC 和 SHA。你没法比任何别的地址更容易的 得到一个靓号图案开头的地址的私钥。

Eugenia,一位在菲律宾工做的儿童慈善总监。咱们假设 Eugenia 组织了一场比特币募捐活动,并但愿使用靓号比特币地址来宣传这个募捐 活动。 Eugenia将会创造一个以1Kids开头的靓号地址来促进儿童慈善募捐的活动。 让咱们看看这个靓号地址如何被建立,这个靓号地址对 Eugenia 慈善募捐的安全性又意味着什么。

一、生成靓号地址

认识到比特币地址不过是由 Base58 字母表明的一个数字是很是重 要的。搜索“1kids”开头的图案咱们会发 现从 1Kids11111111111111111111111111111 到 1Kidszzzzzzzzzzzzzzzzzzzzzzzzzzzzz 的地 址。这些以“1kid”开头的地址范围中大约有 58 的 29 次方地址(1.4*10^51))。 

咱们把“1Kids”这个前缀看成数字,咱们能够看看比特币地址中这个前缀出现的频 率。若是是一台普通性能的桌面电脑, 没有任何特殊的硬件,能够每秒搜索大约 10 万个密钥。

正如你所见,Eugenia 将不会很快地建立出以“1KidsCharity”开头的 靓号地址,即便她有数千台的电脑同时进行运算。每增长一个字符就会增长 58 倍的计算难度。超过七个字符的图案一般须要专用的硬件才能被找出,譬如用户 定制的具备多个图形处理单元(GPU)的台式机。那些一般是没法继续在比特币 挖矿中盈利的钻机,被从新赋予了寻找靓号地址的任务。用 GPU 系统搜索靓号 的速度比用通用 CPU 要快不少个量级。

另外一种寻找靓号地址的方法是将工做外包给一个矿池里的靓号矿工们,如靓号矿 池中的矿池。一个矿池是一种容许那些 GPU 硬件经过为他人寻找靓号地址来获 得比特币的服务。对小额的帐单,Eugenia 能够将搜索 7 位字符图案的靓号地址的 工做外包,在几个小时内就能够获得结果,而没必要用一个 CPU 搜索上几个月才得 到结果。

生成一个靓号地址是一项经过蛮力的过程:尝试一个随机密钥,检查生成的地址 是否和所需的图案相匹配,重复这个过程直到成功找到为止。

二、靓号地址安全性

靓号地址既能够增长、也能够削弱安全措施,它们着实是一把双刃剑。用于改善 安全性时,一个独特的地址使对手难以使用他们本身的地址替代你的地址,以欺 骗你的顾客支付他们的帐单。不幸的是,靓号地址也可能使得任何人都能建立一 个相似于随机地址的地址,甚至另外一个靓号地址,从而欺骗你的客户。

Eugenia 可让捐款人捐款到她宣布的一个随机生成地址(例如: 1J7mdg5rbQyUHENYdx39WVWK7fsLpEoXZy)。 或者她能够生成一个以“1Kids”开头 的靓号地址以显得更独特。

在这两种状况下,使用单一固定地址(而不是每比捐款用一个独立的动态地址) 的风险之一是小偷有可能会黑进你的网站,用他本身的地址取代你的地址,从而 将捐赠转移给他本身。若是你在不一样的地方公布了你的捐款地址,你的用户能够 在付款以前用本身眼睛检查以确保这个地址跟在你的网站、邮件和传单上看到的 地址是同一个。

在随机地址 1j7mdg5rbqyuhenydx39wvwk7fslpeoxzy 的状况下,普 通用户可能会只检查头几个字符“1j7mdg”,就认为地址匹配。使用靓号地址生成 器,那些想经过替换相似地址来盗窃的人能够快速生成与前几个字符相匹配的地址。

那靓号地址会不会增长安全性?若是 Eugenia 生成 1Kids33q44erFfpeXrmDSz7zEqG2FesZEN 的靓号地址,用户可能看到靓号图案的字 母和一些字符在上面,例如在地址部分中注明了 1Kids33。这样就会迫使攻击者生 成至少 6 个字母相匹 配的的靓号地址(比以前多 2 个字符),就要花费比 Eugenia 多 3364 倍的努力。

本质上,Eugenia 付出的努力(或者靓号池付出的)迫使攻击者不得不生成更长的靓号图案。若是 Eugenia 花钱请矿池生成 8 个字符的靓号地址,攻击者将会被逼迫到10字符的境地,那将是我的电脑,甚至昂贵自定义靓号挖掘机或靓号池也没法生成。对 Eugenia 来讲可承担的起支出,对攻击者来讲则变成了没法承担支出,特别是若是欺诈的潜在回报不足以支付生成靓号地址所 需的费用。

四、纸钱包

纸钱包是打印在纸张上的比特币私钥。有时纸钱包为了方便起见也包括对应的比 特币地址,但这并非必要的,由于地址能够从私钥中导出。纸钱包是一个很是 有效的创建备份或者线下存储比特币(即冷存储)的方式。做为备份机制,一个 纸钱包能够提供安全性,以防在电脑硬盘损坏、失窃或意外删除的状况下形成密 钥的的丢失。做为一个冷存储的机制,若是纸钱包密钥在线下生成并永久不在电 脑系统中存储,他们在应对黑客攻击,键盘记录器,或其余在线电脑威胁更有安全性。

纸钱包有许多不一样的形状,大小,和外观设计,但很是基本的原则是一个密钥和 一个地址打印在纸张上。表 4-14 展示了纸钱包最基本的形式。

经过使用工具,就能够很容易地生成纸钱包,譬如使用 bitaddress.org 网站上的客 户端 Javascript 生成器。这个页面包含全部生成密钥和纸钱包所必须代码,甚至在 彻底失去网络链接的状况下,也能够生成密钥和纸钱包。若要使用它,先将 HTML
页面保存在本地磁盘或外部 U 盘。

从 Internet 网络断开,从浏览 器中打开文件。更方便的,使用一个原始操做系统启动电脑,好比一 个光盘启动 的 Linux 系统。任何在脱机状况下使用这个工具所生成的密钥,均可以经过 USB 线在本地打印机上打印出 来,从而制造了密钥只存在纸张上而从未存储在在线系 统上的纸钱包。将这些纸钱包放置在防火保险柜内,发送比特币到 对应的比特币 地址上,从而实现了一个简单但很是有效的冷存储解决方案。图展现了经过 bitaddress.org 生成的纸钱包。

这个简单的纸钱包系统的不足之处是那些被打印下来的密钥容易被盗窃。一个能 够接近这些纸的小偷只需偷走纸或者用把拍摄纸上的密钥,就能控制被这些密钥 锁定的比特币。一个更复杂的纸钱包存储系统使用 BIP0038 加密的私钥。打印在 纸钱包上的这些私钥被其全部者记住的一个口令保护起来。没有口令,这些被加 密过的密钥也是毫无用处的。但它们仍旧优于用口令保护,由于这些密钥从没有 在线过,而且必须从保险箱或者其余物理的安全存储中导出。图 展现了经过 bitaddress.org 生成的加密纸钱包。

警告虽然你能够屡次存款到纸钱包中,可是你最好一次性提取里面全部的资金。由于若是你提取的金额少于其中的总金额的话,有些钱包可能会 生成一个找零地址。

而且,你所用的电脑可能被病毒感染,那么就有可能泄露私钥。一 次性提走全部余款能够减小私钥泄露的风险,若是你所需的金额比较少, 那么请把余额发送到相同交易的一个新的纸钱包里。

纸钱包有许多设计和大小,并有许多不一样的特性。有些做为礼物送给他人,有季 节性的主题,像圣诞节和新年主题。另 外一些则是设计保存在银行金库或经过某 种方式隐藏私钥的保险箱内,或者用不透明的刮刮贴,或者折叠和防篡改的铝箔 胶粘密封。图展现了几个不一样安全和备份功能的纸钱包的例子。
 

经过 bitcoinpaperwallet.com 生成的、私钥被密封住的纸钱包, 其余设计有密钥和地址的额外副本,相似于票根形式的能够拆卸存根,让你能够存储多个 副本以防火灾、洪水或其余天然灾害。