Bitcoin Vault 比特币保险库 博客 理解钱包地址、密码、私钥、公钥、keystore与助记词

理解钱包地址、密码、私钥、公钥、keystore与助记词

知识背景:非对称加密

私钥是一串随机字符串,来源于密码学中非对称加密的公私钥对。

公钥加密,私钥解密。私钥数字签名,公钥验证。

非对称加密参考链接:维基百科地址百度百科地址

公私钥本身可以互相验证( 私钥加密的内容使用公钥能解开,使用公钥加密的内容使用私钥能解开,而自己加密的东西自己解不开),应用于以下场景:

1. 加密

要发加密信息给A,就使用A的公钥加密之后将密文发给A,只有A拥有的私钥可以解密获得原始信息。那么除了A之外的人就看不了原始信息了。

2. 数字签名 ->即证明“我是我”。

使用私钥签名的信息,拿公钥可以进行验证,以证明该信息是由拥有私钥的人发出。在区块链中,私钥签名后的信息可以由地址进行验证,因而可以使用地址中的资产。

 区块链中的私钥与地址

私钥(Private Key)是一串由随机算法生成的数据,它可以通过非对称加密算法算出公钥,公钥可以再算出币的地址。区块链的私钥,表现形式都是英文字母和数字组成的字符串,根据链不同长度和规则一样。下面放两个以太坊和比特币的例子:

地址
以太坊 0x4483f3f7ef2ddafe8239b15e47ab680656b1761c
比特币 13TdUYzEso2iVLHPCXjwy1yjmUVEQnGebK
私钥
以太坊私钥 L4wvc4ikkdaXW3t63VJkELWLhe9vT369zNdTzAzEBLH6r9wV9HLv
比特币私钥 6f4bd3915ee1eea5e1c6b6dd0bbb66061f143e0a715848512ce0794a4f5596ec

他们的关系像下图

https://upload-images.jianshu.io/upload_images/13608337-e7697c49891535df.jpg?imageMogr2/auto-orient/strip|imageView2/2/w/926
私钥、公钥与地址
钱包生成私钥→私钥生成公钥→公钥生成公钥哈希→公钥哈希生成地址→地址用来接受数字货币

公钥 Public Key

公钥(Public Key)是和私钥成对出现的,和私钥一起组成一个密钥对,保存在钱包中。公钥由私钥生成,但是无法通过公钥倒推得到私钥。公钥能够通过一系列算法运算得到钱包的地址,因此可以作为拥有这个钱包地址的凭证

比特币是采用椭圆加密算法(ECDSA)来产生比特币的私钥和公钥。

基于椭圆加密的原理,由私钥是可以计算出公钥的,再由公钥经过一系列数字签名运算就会得到比特币钱包地址。

因为由公钥可以算出比特币地址,所以我们经常把公钥和比特币地址的说法相混淆,他们都是指的同一个概念,比特币钱包地址只是另一种格式的公钥,但是两者的外在表现形式是不一样的。

从比特币私钥得到我们日常转账所用的比特币钱包地址总共需要九个步骤,中间用到了SHA256加密、RIPEMD160加密和BASE58编码。

平时转帐的时候就是将转账收款钱包地址、金额、手续费等交易信息,通过私钥签名,提交给比特币网络,然后就等矿工们来处理记账(公钥验证),验证通过后交易信息会在比特币网络进行全网广播,矿工每隔10分钟会将比特币网络中未被记账的交易打包进一个区块,这就完成了一次确认,此时比特币已转到对方账户。

通常需要经过6次确认,确保交易记录不能被任何人篡改,转账才算真正完成。

一、理解密码、私钥、keystore与助记词

1.钱包地址

地址就相当于银行卡,那么地址的作用就很明显了:转账收账

在imToken中创建好钱包后,会生成一个0x开头的长度为42的字符串,这个字符串就是我们数字钱包的地址了。比如V神的钱包地址之一:

0x1db3439a222c519ab44bb1144fc28167b4fa6ee6

在以太坊网络中,一个钱包对应了一个地址,该地址不能修改,且该钱包中所有的代币的转账收款地址都是这个地址。

密码学中公钥跟私钥是成对的,公钥由私钥计算而来,地址则通过公钥进一步计算而来。要注意:地址不是公钥,不要混淆概念。总之,有了私钥,就可以推导出它的公钥以及地址

2. 密码

一般钱包在创建地址的时候,会让设置一个密码,相当于银行卡密码。

这个密码不是私钥,密码可以进行修改或重置。它主要用途有两个,一是转账时候的支付密码,二是用 keystore 导入钱包时需要输入的密码,用于解锁keystore。

在钱包应用程序中,创建账号时需要设定一个密码,这个密码一般要求不少于 8 个字符,为了安全,密码最好设置复杂一点。

密码可以进行修改或重置。输入原密码后,就可以直接修改新的密码了;但如果原密码忘记,可以用私钥或是助记词导入钱包,同时设置新的密码。数字货币钱包中,一个钱包在不同手机上可以用不同的密码,彼此相互独立,互不影响。

3. 私钥

非常重要,相当于银行卡号+银行卡密码。

私钥由64位长度的十六进制的字符组成,比如:

0xE4356E49C88C8B7AB370AF7D5C0C54F0261AAA006F6BDE09CD4745CF54E0115A

一个账户只有一个私钥且不能修改,谁拥有私钥就能够掌控该账号的数字货币。通常一个钱包中私钥和公钥是成对出现的,有了私钥,我们就可以通过一定的算法生成公钥,再通过公钥经过一定的算法生成地址,这一过程都是不可逆的,是如何生成的?文末有说明。私钥一定要妥善保管,若被泄漏别人可以通过私钥解锁账号转出你的该账号的数字货币。

在钱包应用程序中,解锁账号后可以导出私钥。

私钥的本质就是个随机数。只不过这个数字是固定长度的,且是16进制的表现形式。这个随机数的产生是钱包功能之一。也就是说,钱包内置了密码级别的随机数产生器,保证产生的随机数是没有规律可循的,也就是说不易破解的。注意钱包是在用户终端运行的,产生的私钥就保存在用户终端,不会也不应该上传给钱包公司。这一点非常重要。大家尽量要使用开源的,被公开考验过的钱包软件,保证安全。

私钥的生成方式是完全随机的,随机生成这样的字符串就会有16的64次方种可能,即:2的256次方,这个数字已经超过了宇宙中原子的个数,用“暴力破解”的方式逐一遍历可能的私钥,幻想能碰到一个有效的且有币的私钥,可以说是不可能,就算是量子计算机也没用。

目前已存在的比特币私钥仅仅只有几百万个,在理想的随机生成方式下(用密码学安全的随机数生成器),如果说你所生成的私钥恰好跟别人的私钥一样,这种概率也是几乎为0。

4. Keystore

Keystore+密码=私钥=银行卡号+银行卡密码、Keystore ≠ 银行卡号

因为私钥不利于记忆,容易被盗,因此有了Keystore。Keystore常见于以太坊钱包,它并不是私钥,而是将私钥以加密的方式保存为一份 JSON 文件,这份 JSON 文件就是 keystore,所以它就是加密后的私钥。但是Keystore必须配合钱包密码才能使用该账号,所以只有Keystore文件,并不能掌控账号。对于助记词和私钥就不一样了,只要知道助记词或者私钥就能掌控该账号了。

keystore的格式差不多长这样:

{“version”:3,”id”:”b7467fcb-3c8b-41be-bccf-73d43a08c1b7″,”address”:”540f18196da5a533fa36577a81de55f0a2f4e751″,”Crypto”:{“ciphertext”:”78ed11b8b6bf29b00f52b42b8542df0e4a6ac078e626af7edcf885c3b68154a4″,”cipherparams”:{“iv”:”4516579601d96695fe30ace985a9066f”},”cipher”:”aes-128-ctr”,”kdf”:”scrypt”,”kdfparams”:{“dklen”:32,”salt”:”6276cfda7d40872352c801db5871e5a3368a8d0994cea39ed936760db78d1cdc”,”n”:1024,”r”:8,”p”:1},”mac”:”d889a5dc609c3f312a41394cc47640676d2612501a6f8c837ed55598158336db”}}

keystore进行交易转账等钱包操作,必须知道该keystore的密码。keystore的密码是无法更改的,一个keystore对应一个密码。但是可以通过该钱包的助记词重新生成一个keystore。这个keystore可以用新的密码生成,重新生成新的keystore之后,最好将旧的keystore删除。

在应用程序中,可以实现解锁账号后生成Keystore文件,支持的钱包有MetaMask、Mist等。

5. 助记词

等于私钥=银行卡号+银行卡密码

一般来说私钥都有 256 位,以 64 个字母数字构成的 16 进制字符串表示,不利于记录且容易记错,所以用算法将一串随机数转化为了一串12 ~ 24个容易记住的单词,方便保存记录。所以有的同学有了下面的结论:

  • 助记词是私钥的另一种表现形式。是未经加密的私钥,没有任何安全性可言,任何人得到了你的助记词, 可以不费吹灰之力的夺走你的资产。
  • 还有同学说助记词=私钥,这是不正确的说法,通过助记词可以获取相关联的多个私钥,但是通过其中一个私钥是不能获取助记词的,因此助记词≠私钥

目前只有少数钱包应用程序支持导出助记词,如MetaMask等。通过助记词导入账号也只有少数钱包应用程序支持,如MyEtherWallet、imToken等。

一般钱包助记词只能备份一次,备份后,在钱包中便不会再显示。因此,在备份时一定要抄写下来,防止抄写错误,尽量多次检验。

回顾一下私钥空间,比特币、以太坊的私人密钥空间的大小(2^256)是一个难以置信的大数目。

十进制大约是10^77。可见宇宙估计含有10^80原子。

要从这么大的空间里找到一个私钥,它刚好是V神的钱包,这概率堪比大海捞针,而且是不能借助任何工具,还难。

其实,所有的助记词字典,其实只有2048个单词。

通过下面这个连接就可以访问:

https://github.com/bitcoin/bips/blob/master/bip-0039/english.txt

助记词的算法,请查看这篇文章

BIP

要弄清楚助记词与私钥的关系,得清楚BIP协议,是Bitcoin Improvement Proposals的缩写,意思是Bitcoin 的改进建议,用于提出 Bitcoin 的新功能或改进措施。BIP协议衍生了很多的版本,主要有BIP32、BIP39、BIP44。

BIP32

BIP32是 HD钱包的核心提案,通过种子来生成主私钥,然后派生海量的子私钥和地址,种子是一串很长的随机数。

BIP39

由于种子是一串很长的随机数,不利于记录,所以我们用算法将种子转化为一串12 ~ 24个的单词,方便保存记录,这就是BIP39,它扩展了 HD钱包种子的生成算法。

BIP44

BIP44 是在 BIP32 和 BIP43 的基础上增加多币种,提出的层次结构非常全面,它允许处理多个币种,多个帐户,每个帐户有数百万个地址。

在BIP32路径中定义以下5个级别:

m/purpse'/coin_type'/account'/change/address_index
  • purpose:在BIP43之后建议将常数设置为44’。表示根据BIP44规范使用该节点的子树。
  • Coin_type:币种,代表一个主节点(种子)可用于无限数量的独立加密币,如比特币,Litecoin或Namecoin。此级别为每个加密币创建一个单独的子树,避免重用已经在其它链上存在的地址。开发人员可以为他们的项目注册未使用的号码。
  • Account:账户,此级别为了设置独立的用户身份可以将所有币种放在一个的帐户中,从0开始按顺序递增。
  • Change:常量0用于外部链,常量1用于内部链,外部链用于钱包在外部用于接收和付款。内部链用于在钱包外部不可见的地址,如返回交易变更。
  • Address_index:地址索引,按顺序递增的方式从索引0开始编号。

BIP44的规则使得 HD钱包非常强大,用户只需要保存一个种子,就能控制所有币种,所有账户的钱包,因此由BIP39 生成的助记词非常重要,所以一定安全妥善保管,那么会不会被破解呢?如果一个 HD 钱包助记词是 12 个单词,一共有 2048 个单词可能性,那么随机的生成的助记词所有可能性大概是5e+39,因此几乎不可能被破解。

HD钱包

通过BIP协议生成账号的钱包叫做HD钱包。这个HD钱包,并不是Hardware Wallet硬件钱包,这里的 HD 是Hierarchical Deterministic的缩写,意思是分层确定性,所以HD钱包的全称为比特币分成确定性钱包

以太坊对BIP的支持

BIP是用于提出 Bitcoin 的新功能或改进措施,那么对于以太坊来说如何支持呢?

  • 以太坊在EIPs/issues/84中讨论,是否遵循 BIP32 和 BIP44,社区里提出来很多有意思的观点,比特币是基于 UTXO 的,所以可以使用 HD 钱包(BIP32)为每个交易分配一个新地址,以保护您的隐私。然而,以太坊是基于帐户,每个帐户都有一个地址,BIP 是比特币的提案,而且比特币的数据结构的设计是围绕改变地址的想法构建的,BIP 的一些提案可能并不适合以太坊。以太坊的模式和比特币UTXO 不同,以太坊转账不能改变地址,如果在以太坊上实现 UTXO ,用户还必须签名两个交易以将余额的一部分发送到一个地址,将余额的一部分发送到第二个地址 – 这将使成本增加一倍,而且第二个交易可能不会在同一个区块中,当然以太坊也可以通过智能合约的方式实现。另外,以太坊目前官方钱包采用 KDF 的形式,也就是我们常说的 Keystore 的形式。
  • 以太坊在EIPs/issues/85中讨论,以太坊社区似乎也采用了 BIP32 的做法,提议 HD 路径为 : m/44'/60'/0'/0/n,n 是第 n 次生成地址。目前以太坊客户端实现了BIP32的客户端有:Jaxx, Metamask, Exodus, imToken, TREZOR (ETH) & Digital Bitbox

6.脑钱包

看到这里,那脑钱包就很容易理解了,脑钱包的意思就是说你自己先想好一串你独有的英文单词,这串英文单词就可以作为你的私钥。通过一定的计算机算法即可将这串英文字符转化成64位的私钥和地址。

这是以一个脑钱包工具可以参考:http://idgui.com/N/

这样你就只需要记住你特有的英文句子,这样就可以用脑子记住私钥,让你的虚拟财富存在你的脑子里,没有实物存在,除了严刑逼供,任何人都获取不了。

当然,这样做也有一定的风险,抛开失忆不说,人是情感动物,无法做到电脑般冷冰冰的随机,写出的单词句子总是有规律可循的,如果仅仅是一句名人名言,或者是书里的某个句子,很容易就被计算机破解了。总的来说,私钥的生成方式主要来自随机,越不随机越容易被破解。

7.钱包

上面说的脑钱包仅是一种非常特殊的钱包,虚拟概念不存在,连软件都不是,通常的钱包软件服务商,主要就三个功能:

  • 随机数生成器,用来生成你的私钥及地址。
  • 私钥管理器,你可以给钱包配上密码,只有你能”打开“钱包,看到私钥。
  • 接入比特币网络,接受、发送比特币。

只要你拥有私钥,选择任何钱包服务商都可以把你连接到比特币网络,看到你的私钥,查到自己的余额。

二、密码、私钥、keystore与助记词的关系

它们关系可以用下面的图来表述。在接下来的教程中我们会逐一学习如何通过代码实现下面每一条线。

钱包账户

三、钱包的核心:私钥

基于以上的分析,我们对以太坊钱包的账号系统有了一个很好的认识,那么我们在使用钱包的过程中,该如何保管自己的钱包呢?主要包含以下几种方式:

  • 私钥(Private Key)
  • Keystore+密码(Keystore+Password)
  • 助记词(Mnemonic code)

通过以上三种中的一种方式都可以解锁账号,然后掌控它,所以对于每种方式中的数据都必须妥善包括,如有泄漏,请尽快转移数字资产。

我们可以得到以下总结:

  • 通过私钥+密码可以生成keystore,即加密私钥;
  • 通过keystore+密码可以获取私钥,即解密keystore。
  • 通过助记词根据不同的路径获取不同的私钥,即使用HD钱包将助记词转化成种子来生成主私钥,然后派生海量的子私钥和地址。

可以看出这几种方式的核心其实都是为了获得私钥,然后去解锁账号,因此钱包的核心功能是私钥的创建、存储和使用。

 

参考资料

https://web3js.readthedocs.io/en/1.0/web3-eth-accounts.html
https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki
https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki
https://github.com/ethereum/EIPs/issues/84
https://github.com/ethereum/EIPs/issues/85

本文来自网络,不代表Bitcoin Vault 比特币保险库立场,转载请注明出处。

作者: acoolboy

发表评论

联系我们

联系我们

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部