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个目标,但往往是不能兼得最终需要对其进行均衡:
- 可获取性:要用的时候可以随时随地地使用;
- 安全性:保证没有其他人可以动用你的比特币,保证这个比特币是你自己的;
- 便利性,密钥管理应当是简单易行的。
首先从安全以及便捷的角度来看,不应该把所有的比特币存在当地,因为这样会很容易引起臃肿(就像你不会将所有的都放在自己的口袋里随身携带,而是将一部分存在银行或者微信里面)。所以就有了比特币钱包的实现。
钱包的作用:
-
一个简单的接口,告诉你钱包里有多少比特币。
-
使用比特币的时候,处理关于密钥管理的一切技术细节,比如使用密钥或生成新的地址等
-
比特币送达的地址:
-
一种是字符串:base58记号法2,将字母中的容易混淆的去掉,留下了58个
-
一种是QR(Quick Response)码:一个二维码代表比特币地址的字节,通过扫描可以很方便的扫出来
-
虚荣地址:有些商家或个人将地址转换成一些人能够识别的字符。方便一种心理暗示对于某些特定场合会使用到,比如:博彩公司网站中本聪骨头(Satoshi Bones)的收款地址中就含有“骨头”(bones)
-
如何实现:地址都是通过哈希计算产生的随机字符串,如果要指定某一个位置的值是固定的,那么就需要一个个去遍历,58种字符,那么k个固定字符就需要平均生成 5 8 k 58^k 58k次数
-
由于如果直接使用1中的方法会使得计算次数巨大,所以进行了相关优化加速:
- 这是每一次计算的hash函数: H ( g x ) H(g^x) H(gx),正常情况下就是不停地生成地址,直到得到想要的结果为止。
- 主要优化地方:对下一次的计算进行优化,利用上一个结果去计算下一个结果 g x + 1 = g ⋅ g x g^{x+1} =g \cdot g^x gx+1=g⋅gx,使指数运算级别变成了乘法运算的级别。
-
-
-
-
2. 冷存储以及热存储
2.1 定义
-
热储存:把比特币放在你的个人电脑里就像把钱放在钱包里带着——随身携带,随时随地存取;
-
冷储存:是离线的,把比特币锁在其他地方。
2.2 冷热存储之间如何转移
2.2.1 主要转移思路
冷热存储使用不同的私钥,这样的好处就是当一方处于危险的时候另一方并不会受到威胁。那么如何在这两个存储库中转移呢?
- 需要知道对方的地址或公钥
当冷热存储库进行转账的时候,并不需要相互共同在线,这就使得不至于那么容易暴露,等在线的时候再进行接收
2.2.2 转移的两种方式
为了私密性得到保障,我们希望转账的地址不是一成不变的,否则恶意的就很容易找到被转账的人:
-
方法一:通过在之前传输一系列地址,之后可以按照顺序进行使用这一系列地址;
- 缺陷是为了传送地址,我们不得不经常让冷储存端上线
-
方法二:分层确定性钱包Hierarchical Deterministic wallet (HD Wallet)[2]
-
定义:在没有私钥参与的情况下,由公钥直接分散成子公钥,并且分散的子公钥可以由分散的子私钥认证。
-
过程图示:
-
-
两种方法的区别:
- 方法一交易频繁,每笔交易需要不断备份,钱包是一堆随机生成的私钥的集合,这种叫做非确定性钱包。
1. 当前市确定性钱包场现状以及遵循的3个标准
-
现在市场上的大部分数字货币钱包都支持HD Wallet,而且用户可以通过助记词在不同的HD Wallet之间相互导入导出账户
-
这是由于大多数都遵循了3个标准:BIP32、BIP39、BIP44
- B I P 32 BIP32 BIP32:定义HD Wallet的核心提案。
-
钱包可以通过种子来生成主私钥,然后派生海量的子私钥和地址,按照树状结构存储。
- B I P 39 BIP39 BIP39:由于种子是一串很长的随机数,让种子更便于记录转换为一串单词,一般由12个单词构成,称之为助记词(mnemonic code,phrase);就像下面的:
good gather ranch lunar edit hospital comic final fee coin athlete rescue
-
B I P 44 BIP44 BIP44:提出了5层的路径建议,类似于软件定义网络使之能够适合更多币种更多账户,在 BIP32 的基础上,赋予树状结构中的各层不同的意义,
- 最终的效果就是:用户只需一个种子,就能控制所有币种,所有账户的钱包。各层定义如下:
m / purpose'(44) / coin_type' / account' / change / address_index
- $ purporse’ $固定是 44’,代表使用 BIP44。
- 而
c
o
i
n
_
t
y
p
e
′
coin\_type'
coin_type′ 用来表示不同币种,例如:
- Bitcoin ⇒ \Rightarrow ⇒ 0’,
- Ethereum ⇒ \Rightarrow ⇒ 60’。
- a c c o u n t ′ account' account′:表示账户。
-
c
h
a
n
g
e
′
change'
change′:表示交易的种类
- 常量0用于外部链 ⇒ \Rightarrow ⇒ 用于在钱包外部可见的地址(例如,用于接收付款)
- 常量1用于内部链(也称为更改地址) ⇒ \Rightarrow ⇒ 用于在钱包外部不可见的地址,用于返回交易变更。
- a d d r e s s _ i n d e x ′ address\_index' address_index′:表示生产的地址序号(因为有多个子地址),地址按顺序递增的方式从索引0开始编号。
2. 实际中的公私钥生成
ECDSA的工作机制如下:通常一个ECDSA私钥是一个随机数 x x x,其对应的公钥是 g x gx gx。为了生成分层确定性密钥,我们需要另外两个随机数 k k k和 y y y。
- 私钥生成信息: k , x , y k,x,y k,x,y
- 第 i i i个私钥: x = y + H ( k ‖ i ) x=y+H(k‖i) x=y+H(k‖i)
- 地址生成信息: k , g y k,g^y k,gy
- 第 i i i个公钥: g x i = g H ( k ‖ i ) ⋅ g y gxi=gH(k‖i)·gy gxi=gH(k‖i)⋅gy
- 第 i i i个地址: H ( g x i ) H(g^{xi}) H(gxi)
3.通过标准化之后的从种子到私钥的过程:
- 生成一个
助记词
(BIP39 mnemonic code)。 - 助记词使用PBKDF2转化为
种子。
- 种子通过使用HMAC-SHA512生成主
私钥。
- 通过主私钥派生出
子私钥
(BIP32),其中节点布局由BIP44设置。
4. 热存储如何保护私钥以及助记词等的隐私
既然mnemonic code这么重要,除了需要用户进行备份外,那些热钱包是如何保护的私钥,助记词之类的呢?
-
以太坊:
-
官方钱包:
-
采用 KDF 的形式;
-
-
MetaMask:一个开源的以太坊钱包
-
是将助记词加密后存在浏览器的Local Storage中,而解密需要使用用户设置的密码。这里的核心就是:保存私钥或者助记词,是加密保存的,如果不那么做,就等同于明文密码。
-
明文密码不一定就有问题,明文并不代表就一定不安全。加密过的也未必就安全。当然还有一次中心化钱包和交易所,都是把一定比例的币进行冷存储,留一些放在热钱包里,做到热冷分离。
-
-
2.2.3 几种实现钱包的方案
1. 大脑钱包
原理是用一个可预测的算法把一个口令变成一对公钥/私钥,你可以选择一个哈希算法将口令转译成一个私钥。在给定私钥的情况下,可以用同样的方法得到私钥。之后可以用分层确定方法生成一一系列私钥
安全性:
- 黑客猜到你的口令的话,他还是可以偷走你大脑钱包里的所有私钥
- 黑客可以下载一堆未被使用的比特币的地址,然后用电脑程序去慢慢地试错,黑客都不需要知道大脑钱包的地址,这被称为离线猜测或者密码破解。
- 所以最终就看口令的复杂度
增加安全性的方法:
- 可以让程序生成密钥的速度变慢(为程序加入一个延迟);
- 把本来很容易计算的哈希函数SHA-256算上220次,这样一来就把黑客的工作量增加了220倍。
2. 纸钱包
把密钥印在纸上,然后把纸锁在保险箱里
3. 防损硬件
用它来保存密钥或用它来生成密钥,总之,此类设备本身不会泄露密钥或输出密钥,而只是在我们按下设备的某个按钮或输入设备密码后显示密钥的保管状态。
4. 总结
大脑钱包就相当于一种映射,将口令映射成公私钥,主要看口令存在哪才知道它是冷存储还是热存储,而纸钱包和防损硬件这种都是冷存储,都是放在一个地方进行加密锁好,等用的时候再拿出来
3. 安全性
- 热储存端的安全性较低。如果热储存受到损害,那么上文提到的非相关性就不复存在,但这种情况下,私钥(以及比特币)仍然是安全的。通常,分层确定性钱包支持任意多个安全等级——这也是“分层”的由来——虽然,我们还没有讨论细节。这种安排非常有用,例如,当一家公司内部存在多种授权级别时,就需要这种特性
- 冷储存如何保存信息(私钥或私钥生成信息)。第一种方式是将信息保存在某个设备(例如笔记本电脑、手机或平板电脑,或U盘)中,然后将这个设备好好保管,最好是让这些设备断开网络,并将其锁起来,这样,如果有人想盗取信息,那么他首先需要进入这些设备的保存处。
参考文章:
2.数字货币钱包 分层确定性钱包介绍(HD wallets)