区块链重要基础知识8-1——冷存储以及热存储和他们之间相互如何结合

1. 与本地存储相关

Base58

  • 主要用于产生Bitcoin的钱包地址(对应的就是热存储或者冷存储的地址);
  • 采用的字符集合为“123456789abcdefghijkmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ”,从这不难看出,Base58是纯数字与字母组成而且去掉了容易引起视觉混淆的字符(0:数字零,O:大写O,I:大写i,l:小写L)。9个数字+49个字母=58个。由于没有特殊字符所以在采用鼠标双击或移动设备选择时可以自动识别全选。Base58本身就是URLSafe。Base64的URFSafe模式虽然已经对URL支持的比较好,但UUID1[1]中还是包含“-或_”。目前流行的比特币,采用的就是Base58Check编码,是在Base58基础上又增加了安全效验机制。
使用比特币
公共信息:记录在区块链上的内容
比特币的识别信息
币值等
私密信息
比特币持有人-也就是你本人的私钥
存储比特币

存储比特币需要完成3个目标,但往往是不能兼得最终需要对其进行均衡:

  1. 可获取性:要用的时候可以随时随地地使用;
  2. 安全性:保证没有其他人可以动用你的比特币,保证这个比特币是你自己的;
  3. 便利性,密钥管理应当是简单易行的。

首先从安全以及便捷的角度来看,不应该把所有的比特币存在当地,因为这样会很容易引起臃肿(就像你不会将所有的都放在自己的口袋里随身携带,而是将一部分存在银行或者微信里面)。所以就有了比特币钱包的实现。

钱包的作用

  1. 一个简单的接口,告诉你钱包里有多少比特币。

  2. 使用比特币的时候,处理关于密钥管理的一切技术细节,比如使用密钥或生成新的地址等

    1. 比特币送达的地址:

      1. 一种是字符串:base58记号法2,将字母中的容易混淆的去掉,留下了58个

      2. 一种是QR(Quick Response)码:一个二维码代表比特币地址的字节,通过扫描可以很方便的扫出来

        QR码

        1. 虚荣地址:有些商家或个人将地址转换成一些人能够识别的字符。方便一种心理暗示对于某些特定场合会使用到,比如:博彩公司网站中本聪骨头(Satoshi Bones)的收款地址中就含有“骨头”(bones)

          1. 如何实现:地址都是通过哈希计算产生的随机字符串,如果要指定某一个位置的值是固定的,那么就需要一个个去遍历,58种字符,那么k个固定字符就需要平均生成58k58^k次数

            平均下来的次数.jpg

          2. 由于如果直接使用1中的方法会使得计算次数巨大,所以进行了相关优化加速:

            1. 这是每一次计算的hash函数:H(gx)H(g^x),正常情况下就是不停地生成地址,直到得到想要的结果为止。
            2. 主要优化地方:对下一次的计算进行优化,利用上一个结果去计算下一个结果gx+1=ggxg^{x+1} =g \cdot g^x,使指数运算级别变成了乘法运算的级别。

2. 冷存储以及热存储

2.1 定义

  1. 热储存:把比特币放在你的个人电脑里就像把钱放在钱包里带着——随身携带,随时随地存取;

  2. 冷储存:是离线的,把比特币锁在其他地方。

2.2 冷热存储之间如何转移

2.2.1 主要转移思路

冷热存储使用不同的私钥,这样的好处就是当一方处于危险的时候另一方并不会受到威胁。那么如何在这两个存储库中转移呢

  • 需要知道对方的地址或公钥

当冷热存储库进行转账的时候,并不需要相互共同在线,这就使得不至于那么容易暴露,等在线的时候再进行接收

2.2.2 转移的两种方式

为了私密性得到保障,我们希望转账的地址不是一成不变的,否则恶意的就很容易找到被转账的人:

  1. 方法一:通过在之前传输一系列地址,之后可以按照顺序进行使用这一系列地址;

    1. 缺陷是为了传送地址,我们不得不经常让冷储存端上线
  2. 方法二:分层确定性钱包Hierarchical Deterministic wallet (HD Wallet)[2]

    1. 定义:在没有私钥参与的情况下,由公钥直接分散成子公钥,并且分散的子公钥可以由分散的子私钥认证。

    2. 过程图示:

      没有私钥参加
      一个分散成多个
      公钥+信息形成签名
      签名+私钥返回true和false,验证是否正确
      一定的限制条件
      公钥
      一系列子公钥
      分散的子私钥
  3. 两种方法的区别:

    1. 方法一交易频繁,每笔交易需要不断备份,钱包是一堆随机生成的私钥的集合,这种叫做非确定性钱包

1. 当前市确定性钱包场现状以及遵循的3个标准

  • 现在市场上的大部分数字货币钱包都支持HD Wallet,而且用户可以通过助记词在不同的HD Wallet之间相互导入导出账户

  • 这是由于大多数都遵循了3个标准:BIP32、BIP39、BIP44

    1. BIP32BIP32:定义HD Wallet的核心提案
    • 钱包可以通过种子来生成主私钥,然后派生海量的子私钥和地址,按照树状结构存储。

      通过种子生产
      派生1
      派生2
      钱包
      私钥
      子私钥
      地址
      以树状结构存储
    1. BIP39BIP39:由于种子是一串很长的随机数,让种子更便于记录转换为一串单词,一般由12个单词构成,称之为助记词(mnemonic code,phrase);就像下面的:
    good gather ranch lunar edit hospital comic final fee coin athlete rescue
    
    1. BIP44BIP44:提出了5层的路径建议,类似于软件定义网络使之能够适合更多币种更多账户,在 BIP32 的基础上,赋予树状结构中的各层不同的意义

      • 最终的效果就是:用户只需一个种子,就能控制所有币种,所有账户的钱包。各层定义如下:
      m / purpose'(44) / coin_type' / account' / change / address_index
      
      1. $ purporse’ $固定是 44’,代表使用 BIP44。
      2. coin_typecoin\_type' 用来表示不同币种,例如:
        1. Bitcoin \Rightarrow 0’,
        2. Ethereum \Rightarrow 60’。
      3. accountaccount':表示账户。
      4. changechange':表示交易的种类
        1. 常量0用于外部链\Rightarrow 用于在钱包外部可见的地址(例如,用于接收付款)
        2. 常量1用于内部链(也称为更改地址)\Rightarrow 用于在钱包外部不可见的地址,用于返回交易变更。
      5. address_indexaddress\_index':表示生产的地址序号(因为有多个子地址),地址按顺序递增的方式从索引0开始编号。

2. 实际中的公私钥生成

ECDSA的工作机制如下:通常一个ECDSA私钥是一个随机数xx,其对应的公钥是gxgx。为了生成分层确定性密钥,我们需要另外两个随机数kkyy

  1. 私钥生成信息:k,x,yk,x,y
  2. ii个私钥:x=y+H(ki)x=y+H(k‖i)
  3. 地址生成信息:k,gyk,g^y
  4. ii个公钥:gxi=gH(ki)gygxi=gH(k‖i)·gy
  5. ii个地址:H(gxi)H(g^{xi})

3.通过标准化之后的从种子到私钥的过程:

分层确定钱包示意

  1. 生成一个助记词(BIP39 mnemonic code)。
  2. 助记词使用PBKDF2转化为种子。
  3. 种子通过使用HMAC-SHA512生成主私钥。
  4. 通过主私钥派生出子私钥(BIP32),其中节点布局由BIP44设置。

4. 热存储如何保护私钥以及助记词等的隐私

既然mnemonic code这么重要,除了需要用户进行备份外,那些热钱包是如何保护的私钥,助记词之类的呢?

  • 以太坊:

    • 官方钱包:

      1. 采用 KDF 的形式;

        参数1
        参数2
        密码是拿到私钥的关键,所以一定要备份
        公钥
        私钥
        打包保存在keystore
        对keystor加密
        备份 keystore 同时需要备份对应的密码
    • MetaMask:一个开源的以太坊钱包

      • 是将助记词加密后存在浏览器的Local Storage中,而解密需要使用用户设置的密码。这里的核心就是:保存私钥或者助记词,是加密保存的,如果不那么做,就等同于明文密码。

      • 明文密码不一定就有问题,明文并不代表就一定不安全。加密过的也未必就安全。当然还有一次中心化钱包和交易所,都是把一定比例的币进行冷存储,留一些放在热钱包里,做到热冷分离。

        加密存在浏览器中的
        从中拿出
        助记词
        Local Storage
        对加密的助记词进行解密

2.2.3 几种实现钱包的方案

1. 大脑钱包

原理是用一个可预测的算法把一个口令变成一对公钥/私钥,你可以选择一个哈希算法将口令转译成一个私钥。在给定私钥的情况下,可以用同样的方法得到私钥。之后可以用分层确定方法生成一一系列私钥

安全性:

  • 黑客猜到你的口令的话,他还是可以偷走你大脑钱包里的所有私钥
  • 黑客可以下载一堆未被使用的比特币的地址,然后用电脑程序去慢慢地试错,黑客都不需要知道大脑钱包的地址,这被称为离线猜测或者密码破解。
  • 所以最终就看口令的复杂度

增加安全性的方法:

  1. 可以让程序生成密钥的速度变慢(为程序加入一个延迟);
  2. 把本来很容易计算的哈希函数SHA-256算上220次,这样一来就把黑客的工作量增加了220倍。

2. 纸钱包

把密钥印在纸上,然后把纸锁在保险箱里

3. 防损硬件

用它来保存密钥或用它来生成密钥,总之,此类设备本身不会泄露密钥或输出密钥,而只是在我们按下设备的某个按钮或输入设备密码后显示密钥的保管状态。

4. 总结

大脑钱包就相当于一种映射,将口令映射成公私钥,主要看口令存在哪才知道它是冷存储还是热存储,而纸钱包和防损硬件这种都是冷存储,都是放在一个地方进行加密锁好,等用的时候再拿出来

3. 安全性

  • 热储存端的安全性较低。如果热储存受到损害,那么上文提到的非相关性就不复存在,但这种情况下,私钥(以及比特币)仍然是安全的。通常,分层确定性钱包支持任意多个安全等级——这也是“分层”的由来——虽然,我们还没有讨论细节。这种安排非常有用,例如,当一家公司内部存在多种授权级别时,就需要这种特性
  • 冷储存如何保存信息(私钥或私钥生成信息)。第一种方式是将信息保存在某个设备(例如笔记本电脑、手机或平板电脑,或U盘)中,然后将这个设备好好保管,最好是让这些设备断开网络,并将其锁起来,这样,如果有人想盗取信息,那么他首先需要进入这些设备的保存处。

参考文章:

1BASE58算法编码计算器

2.数字货币钱包 分层确定性钱包介绍(HD wallets)


  1. 通用唯一标识符(UUID)是标识唯一Internet对象或数据的128位数字。 UUID由算法生成,其值基于计算机的网络地址,UUID被许多软件公司使用,例如微软和苹果,并且被广泛用作微软全球唯一标识符(GUID)的组件。其他UUID用途包括Linux的ext2/ext3文件系统,在任何生成的UUID中始终存在某种唯一性。保证的唯一标识符包括对UUID生成主机的网络地址的引用、时间戳和任意组件。 ↩︎

  2. 为什么是58个字符?我们把大写小写字母都算上,然后去掉几个比较容易混淆的字母,比如大写的“O”与“0”看起来很像,就得到了58个字符。 ↩︎

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章