鉴于私钥的重要性,我们需要以一种安全地方式保存它,而不是简单地 存到一个文件里。

keystore 允许你用加密的方式存储密钥。这是安全性(一个攻击者需要 keystore 文件和你的钱包口令才能盗取你的资金)和可用性(你只需要 keystore 文件和钱包口令就能用你的钱了)两者之间完美的权衡。

下图是一个keystore文件的内容:

keystore

从图中可以看出,keystore的生成使用了两重算法:首先使用你指定的钱包口令 采用kpf参数约定的算法生成一个用于AES算法的密钥,然后使用该密钥 结合ASE算法参数iv对要保护的私钥进行加密。

由于采用对称加密算法,当我们需要从keystore中恢复私钥时,只需要 使用生成该钱包的密码,并结合keystore文件中的算法参数,即可进行 解密出你的私钥。

这一部分我们直接基于nebulasio 的实现代码进行简单封装,得到KeyStore实现类,它有两个静态方法:

  1. KeyStore::save($privateKey,$pass,$walletDir)
  2. KeyStore::load($pass,$walletFile)

例如,下面的代码使用口令123将私钥存入./keystore目录,并返回钱包文件名:

  1. $wfn = EthTool\KeyStore::save('0x19092...','123','./keystore');
  2. echo 'wallet file: ' . $wfn . PHP_EOL;

下面的代码使用口令123从钱包文件恢复出私钥:

  1. $privateKey = EthTool\KeyStore::load('123','./keystore/1b71...');
  2. echo 'private key: ' . $privateKey . PHP_EOL;

分类: web

标签:   ethereum