以太坊中私钥、公钥、账户地址详解

  • 在学习以太坊的过程中,有些描述告诉我:公钥和账户地址有关系。

一个以太坊地址就代表着一个以太坊账户,地址是账户的标识。对于外部账户来说,地址表示的是该账户公钥的后20字节(通常会以0x开头,例如,0xcd2a3d9f938e13cd947ec05abc7fe734df8dd826,该地址使用的是16进制表示法2)。

  • 自己的疑问:那私钥呢?就是我们创建账户时,输入的密码吗?这也太简单了吧?
  • 于是自己通过查阅资料,学习了私钥、公钥、账户地址之间的关系。

1. 私钥

  • 以太坊中,每个账户都由一对钥匙定义,一个私钥(Private Key)和一个公钥(Public Key)。
  • 私钥是随机生成的256 bit(32 byte)0,1字符串,这样的字符串真的很难记忆,只能选择保存到某问文件中,或者手写下来?
  • 比特币中,私钥的保存方式是:把一串很长的私钥用你能想到最可靠的办法保存起来,比方说写到一张纸条上然后把它藏到喜马拉雅之颠;私钥的保存,甚至催生一条产业链和一批创业公司,比方说电子硬件钱包,专门帮你保存私钥到一个便携的设备中。
  • 以太坊世界中,私钥的表现形式和保存方式又不一样了:它由一个密码一个keyfile组成。这个密码就是你使用personal.newAccount("xxx")创建新账户时输入的那串“xxxx”字符串。而keyfile是你在创建账户后自动生成的json格式的文件,他一般保存在~/keystore/目录下。
  • 在以太坊客户端,如geth中,通过密码和keyfile,解密出私钥。注意: 密码和keyfile文件一个都不能丢,如果你忘记了密码或者keyfile丢失了,恰好你的账户里很有多ether的话,那么要不要考虑一下为自己默哀呢?
  • 温馨提示: 私钥、密码、keyfile文件都不要随意给别人,自己当做秘密保存好吧!
    以太坊中私钥、公钥、账户地址详解_第1张图片
  • keyfile文件实例:
{"address": //该账户的地址 
	"3f0f47dc5f9403c8123dc622594b007331079755",
	"crypto":{
		"cipher":"aes-128-ctr",//加密方法使用的是AES-128-CTR算法4 
		"ciphertext":"a8c11e257d3c74fb9a73e7685747c6738d18f38cd551ff879dd22e664bc1f9c6", //加密后的密文 
		"cipherparams":{ //AES-128-CTR算法加密所需的相关参数 
			"iv":"a0257f085059a07f17c0ff91b73e717b"},
		"kdf":"scrypt",//秘钥生成函数,用于使用密码对keystore文件进行加密 
		"kdfparams":{//kdf算法所需的参数 
			"dklen":32,
			"n":262144,
			"p":1,
			"r":8,
			"salt":"6e43a869886bbae4c0a7b70c53cb78de53dd681125a43814e24360182a96c909"},
		"mac":"6043e567979b960364e8a7788ecf873b160a48f674fceba339e8a3937da6d8b5"//用于验证密码的编码
	},
	"id":"ac8209ef-f917-4166-8db3-2ff981c63bfe",
	"version":3
	}

2. 公钥和账户地址

  • 使用椭圆曲线算法ECDSA-secp256k1将私钥映射生成公钥,一个私钥只能映射出一个公钥。
  • 使用hash算法Keccak-256对公钥进行hash,将公钥转化为32 byte,然后去最后的20 byte作为账户地址。
  • 公钥和账户地址都可以公开!
  • 整个生成过程如下:
    以太坊中私钥、公钥、账户地址详解_第2张图片
    参考链接:
    【Ethereum基础】:账户、地址、私钥和公钥
    以太坊账户私钥、公钥、地址的生成
    关于以太坊中私钥公钥
    以太坊中的账户(Account)
    以太坊账户安全说明

你可能感兴趣的:(区块链)