在以太坊开发中,经常会遇到将账户私钥的keystore与privatekey相互转换的需求,今天特以此文整理记录一下。
转换使用的是keythereum
工具,github地址为:
https://github.com/ethereumjs/keythereum
Keythereum是一个用于生成,导入和导出以太坊密钥的JavaScript工具。
1、安装
npm install keythereum
2、创建一个账户
var keythereum = require("keythereum");
// optional private key and initialization vector sizes in bytes
// (if params is not passed to create, keythereum.constants is used by default)
var params = { keyBytes: 32, ivBytes: 16 };
var password = "linjing";
// synchronous
var dk = keythereum.create(params);
var options = {
kdf: "pbkdf2",
cipher: "aes-128-ctr",
kdfparams: {
c: 262144,
dklen: 32,
prf: "hmac-sha256"
}
};
// synchronous
var keyObject = keythereum.dump(password, dk.privateKey, dk.salt, dk.iv, options);
keythereum.exportToFile(keyObject); //将密钥写入到当前js目录下的keystore目录下
console.log(keyObject) //控制台输出
输出的是keystore形式的密钥,如:
> node createKey.js
{ address: 'd2f9e7716cc88944e5ed9f675649532c80d765f8',
crypto:
{ cipher: 'aes-128-ctr',
ciphertext:
'd826f2ac920a03e47c030e5431d16e097ef68ada8db9c00031dae6689446d499',
cipherparams: { iv: '565d6d8b427a5d5198379f72b631c539' },
mac:
'e56cbd9a027f96127845b310efce8204a127cad72207a30a01b1d4dcf8b56831',
kdf: 'pbkdf2',
kdfparams:
{ c: 262144,
dklen: 32,
prf: 'hmac-sha256',
salt:
'f2dd3458803fee559c7c5593fedbe32eab747e807ff2151a6597452d1484705d' } },
id: 'b91f02be-eeb5-4cd8-829e-b8d077dbfdf1',
version: 3 }
3、keystore形式转换为privatekey
var keythereum = require("keythereum");
//keystore密钥存放目录,在project目录下的keystore目录下,密钥以address命名
var datadir = "/Users/linjingjing/Documents/project";
var address= "d2f9e7716cc88944e5ed9f675649532c80d765f8";
const password = "linjing";
var keyObject = keythereum.importFromFile(address, datadir);
var privateKey = keythereum.recover(password, keyObject);
console.log(privateKey.toString('hex'));
运行后会看到账户私钥:
> node keystore2pk.js
eaffcd749482e68ca4ccf5a07a52eb7ff876ea461fbab642b2b57bcb33edb280
4、privateKey转换为keystore
可以使用Geth客户端来进行转换,进入到Geth控制台中,使用命令:
> web3.personal.importRawKey("eaffcd749482e68ca4ccf5a07a52eb7ff876ea461fbab642b2b57bcb33edb280","linjing")
"0xd2f9e7716cc88944e5ed9f675649532c80d765f8"
keystore已经存放到了--datadir
指定的目录中。