在过去的世界中,当我们不小心把密码弄丢时,只需要提交一个忘记密码的申请,然后就会收到一封可以修改新密码的邮件。

但是在新世界中,这将不复存在。因为这是人类历史上,第一次通过技术彻底纯粹地保障私有财产神圣不可侵犯

但是所有的一切都建立在如何妥善保管你的私钥之上。

私钥,即财富。

钱包生成机制

钱包由私钥、公钥构成,私钥于公钥是通过非对称加密算法生成的。

在1976年之前,所有的加密方式都是同一种模式,通过同一种加密规则进行加密和解密,其被称为对称加密算法。此加密算法最大的弱点就是双方都需要了解加密规则,而保存和传递的过程存在极高的风险。

知道1977年,Ron Rivest、Adi Shamir 和 Leonard Adleman 设计了一种非对称加密算法,此算法以他们三人名字命名,被称为RSA算法

img

数字霍米采用椭圆曲线算法,它同样是非对称算法,相比与RSA算法的优势是,安全性能高、计算量小、存储空间占用小、带宽要求低等。

每一个钱包账户包含一份密钥对,即公钥与私钥。私钥是一个数字,通常是随机选出的。有了私钥,我们可以使用椭圆曲线乘法这个单向加密的函数生成一个公钥,有了公钥,我们就可以使用一个单向加密的哈希函数生成账户地址。

当发生交易时,每笔交易都需要生成一个有效签名才会被存储在区块链中。只有有效的私钥才能产生有效的数字签名,因此拥有钱包账户的私钥就有有该账户的支配权。

钱包形态

在了解钱包的生成机制之后,我们备份钱包其实就是备份私钥。但是保管方式的不同,所表现出的形态也不同。

目前常见的形态:

  1. Private Key
  2. Keystore && Password
  3. Mnemonic Seed

Private Key

Private Key是一份随机生成的256位二进制数字,你甚至可以用抛硬币的方式生成你的私钥:抛硬币256此,记录正反面并转换为0和1,即是256位二进制数字的私钥。

Keystore && Password

在以太坊官方钱包中,私钥与公钥将会以加密(创建钱包时设置的密码)的方式保存为亦非JSON文件,存储在/Users/yourname/Library/Ethereum/keystore中。这份JSON文件就是Keystore,所以需要同时备份KeyStore和对应的password

Mnemonic code

Mnemonic code 由 BIP 39 提案提出,目的是通过随机生成的12 ~ 24个容易记录的单词,单词序列通过PBKDF2与HMAC-SHA512函数创建出随机种子,该种子通过BIP-0032提案的方式生成确定性钱包。

BIP 39 定义助记码创建过程如下:

  1. 创造一个 128 到 256 位的随机顺序(熵)。
  2. 提出 SHA256 哈希前几位,就可以创造一个随机序列的校验和。
  3. 把校验和加在随机顺序的后面。
  4. 把顺序分解成 11 位的不同集合,并用这些集合去和一个预先已经定义的 2048个单词字典做对应。
  5. 生成一个 12 至 24 个单词的助记码。

所以当你记住 12 ~ 24 个助记码后,就相当于记住私钥。助记码要比私钥更方便记忆和保管。目前支持助记码的钱包有 imToken 和 jaxx 。

钱包备份

钱包的形态多样,因此备份的方式也多种多样,但是目的相同:防盗、防丢、分散风险

  • 防盗:分离备份,加入keystore或密码被盗,但对应的密码或keystore依然安全
  • 防丢:多处备份,降低丢失所有对应的keystore && password、助记码、私钥等风险
  • 分散风险:将资金适当分散,降低损失程度,同事采用多重签名方式,提取超过限制金额,需要多把私钥授权等。

常见的备份方式:

  1. 多出和分离备份keystore && password
  2. 纸钱包
  3. 脑钱包
  4. 多重签名

多出和分离备份keystore && password

  1. 打开以太坊官方钱包,在菜单栏中选择 ACCOUNTS -> BACKUP -> ACCOUNTS,你会看到一个 keystore 文件夹,在里面保存你创建过的钱包账户,以 UTC--2016-08-16....... 格式命名的 JSON 文件,这就是你的 keystore 文件。
  2. 将 keystore 文件放置多处安全的位置,如离线的 USB 以及你信任的云存储服务商。
  3. keystone 对应的 password,你应该采用强密码,同样多处且与 keystore 分离备份。

纸钱包备份

纸钱包实质就是将 keystore 或 私钥以纸质化形式保存,一般为二维码形式。

你可以通过命令行的方式

cat /Users/yourname/Library/Ethereum/keystore/<key_file> | qrencode -o keystore.png

也可以到 MyEtherWallet: Open Source JavaScript Client-Side Ether Wallet 离线提交你的 keystore 或 私钥,就可以直接打印对应的二维码纸钱包。

脑钱包

我们所说的脑钱包并不是由用户自身输入自定义的词句生成私钥(因为这并不安全),而是通过 BIP 39 提案的方式生成足够随机的,可记忆的助记码。这是一个方案,但不是一个非常好的方案,因为人类的大脑并不总是靠谱。

多重签名

多重签名是一个不错的选择,它的优势是当你需要提取超过限制的金额时,需要多把私钥同时授权,同时提升防盗,防丢的安全性。

在以太坊官方钱包中,你可以在 Wallet Contracts 下方中选择 Add Wallet Contract,前提是你用来创建 Wallet Contract 的 account 有不少于 0.02 ETH,足以支付交易所需的费用。

img

当你选择 MULTISIGNATURE WALLET CONTRACT ,将会看到如下提示:

“This is a joint account controlled by X owners. You can send up to Y ether per day. Any transaction over that daily limit requires the confirmation of Z owners.”

X 代表此钱包合约由多少账户控制
Y 代表在单个账户授权情况下,每日可提款的上限
Z 代表突破提款上限,需要多少账户授权

默认我们采取 X = 3 ,Z =2 的方式,钱包合约由三个账户管理,需突破取款上限需要两个账户同时授权。

采取多重签名的机制后,你可以多处且分离的方式保管你的 keystore 和 password,提升防盗,防丢的安全性。

关于更多多重签名的详情可看官方文档: Account Management — Ethereal Homestead 0.1 documentation