以太坊的每个外部账户私钥 /地址对,都存储在一个钥匙文件里——keystore文件。这个文件是 JSON 格式,但是私钥等隐私重要的信息都是被加密存储的,你可以通过密码去解锁你的私钥用于签署交易。所以歌这个文件就意味着你的私钥,一定要保管好。
keystore的文件格式
{
'address': '123456789',
'crypto':
{
'cipher': 'aes-128-ctr',
'cipherparams':
{
'iv': 'a1afa641398e8e09fd2db05ca879cff4'
},
'ciphertext':
'ab7fac3ee124801243d105f97057fee36f55539dd44fc9dbf43709433b1f0308ca16a93002',
'kdf': 'pbkdf2',
'kdfparams':
{
'c': 1000000,
'dklen': 32,
'prf': 'hmac-sha256',
'salt': 'c79b4272523dc76abfea583f1a210f5f'
},
'mac': '19fdcefefa6314170ade98db3fb8ad44a1de5b81279719770619ecd556f65925'
},
'id': '4b436468-601d-4a2a-b83e-422b0a06cd01',
'version': 3
}
version
- 版本号address
- 是加密后的公钥,明文显示id
- 随机
主要内容在crypto中:
- cipher:对称 AES 算法的名称,用于加密用户私钥;
- cipherparams:上述 cipher 算法需要的参数,iv初始化向量;
- ciphertext:以太坊私钥使用上述 cipher 算法进行加密后密文;
- kdf:密钥生成函数,用来增强用户的密码强度,同时生成aes的密钥加密 私钥;
- kdfparams:上述 kdf 算法需要的参数,还有scrypt;
- Mac:用于验证解密后的私钥是否正确。
生成keystore过程
1,使用用户输入的密码,kdf参数,通过kdf函数生成aes的密钥,aes使用的iv则是通过随机函数随机生成的;
2、将用户的私钥,通过aes加密算法,以及上一步骤生成的密钥,生产eth的私钥的密文;
3、将kdf的生成aes私钥的种子的后半段和用户私钥的密文,一起做hash,生成mac;
4、使用用户私钥,生成用户的以太坊地址;
最后一个步骤其实可以省略,后边我打算把把keystore这种方案移植到fabric中,用来保护fabircde私钥;通过这一系列步骤,我们可以把必要的输出,获取到组成一个json文件,存储到本地,用的使用只需要输入密码,就可以获取到用户的私钥;
获取私钥过程
1,用户输入密码,pdf函数通过密码和keystore中获取到参数,生产aes的密钥;
2、将aes密钥的种子的后16bit和ciphertext,做hash;
3、将第二步的结果与mac值比较
4、如果第三步相等,则使用aes密钥解密私钥的密文,生成私钥,否则失败;
从整个流程可以看出,用户只需要记住密码就可以了,相对于助记词来说更简单了,但是助记词的功能更强大,也更广泛;