天天看點

如何解密keystore檔案

如果你用 geth 建立過賬号「geth –datadir /path/to/data account new」,那麼多半知道 keystore 檔案,它通過一個 password 加密儲存着賬号的私鑰:

如何解密keystore檔案

keystore

如果我想拿到加密前的私鑰怎麼辦?最容易想到的辦法是在 MetaMask 中導入賬号的時候選擇通過 JSON 檔案導入的方式,然後再導出私鑰。不過這個方法不友善,也無法實作自動化,下面看看如何通過 golang 解密 keystore 檔案:

package main

import (
    "encoding/hex"
    "flag"
    "fmt"
    "io/ioutil"
    "os"

    "github.com/ethereum/go-ethereum/accounts/keystore"
    "github.com/ethereum/go-ethereum/crypto"
)

var (
    file     = flag.String("file", "", "file")
    password = flag.String("password", "", "password")
)

func init() {
    flag.Parse()
}

func main() {
    if _, err := os.Stat(*file); os.IsNotExist(err) {
        flag.Usage()
        os.Exit(1)
    }

    keyjson, err := ioutil.ReadFile(*file)
    if err != nil {
        panic(err)
    }

    key, err := keystore.DecryptKey(keyjson, *password)
    if err != nil {
        panic(err)
    }

    address := key.Address.Hex()
    privateKey := hex.EncodeToString(crypto.FromECDSA(key.PrivateKey))

    fmt.Printf("Address:\t%s\nPrivateKey:\t%s\n",
        address,
        privateKey,
    )
}           

複制

更新:本文僅為示範,不推薦通過 flag 傳遞密碼,否則可以在 history 中看到。