diff options
author | Steven Roose <stevenroose@gmail.com> | 2018-06-08 21:07:07 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2018-06-08 21:07:07 +0800 |
commit | 13af27641829f61d1e6b383e37aab6caae22f2c1 (patch) | |
tree | 35607044459f66249bf8d39e32996b1fcd0c4cf7 /cmd/ethkey/changepassphrase.go | |
parent | ea06da089264508601a9f967160b8c7f335071fa (diff) | |
download | dexon-13af27641829f61d1e6b383e37aab6caae22f2c1.tar dexon-13af27641829f61d1e6b383e37aab6caae22f2c1.tar.gz dexon-13af27641829f61d1e6b383e37aab6caae22f2c1.tar.bz2 dexon-13af27641829f61d1e6b383e37aab6caae22f2c1.tar.lz dexon-13af27641829f61d1e6b383e37aab6caae22f2c1.tar.xz dexon-13af27641829f61d1e6b383e37aab6caae22f2c1.tar.zst dexon-13af27641829f61d1e6b383e37aab6caae22f2c1.zip |
cmd/ethkey: add command to change key passphrase (#16516)
This change introduces
ethkey changepassphrase <keyfile>
to change the passphrase of a key file.
Diffstat (limited to 'cmd/ethkey/changepassphrase.go')
-rw-r--r-- | cmd/ethkey/changepassphrase.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/cmd/ethkey/changepassphrase.go b/cmd/ethkey/changepassphrase.go new file mode 100644 index 000000000..d1ae2ae0d --- /dev/null +++ b/cmd/ethkey/changepassphrase.go @@ -0,0 +1,72 @@ +package main + +import ( + "fmt" + "io/ioutil" + "strings" + + "github.com/ethereum/go-ethereum/accounts/keystore" + "github.com/ethereum/go-ethereum/cmd/utils" + "gopkg.in/urfave/cli.v1" +) + +var newPassphraseFlag = cli.StringFlag{ + Name: "newpasswordfile", + Usage: "the file that contains the new passphrase for the keyfile", +} + +var commandChangePassphrase = cli.Command{ + Name: "changepassphrase", + Usage: "change the passphrase on a keyfile", + ArgsUsage: "<keyfile>", + Description: ` +Change the passphrase of a keyfile.`, + Flags: []cli.Flag{ + passphraseFlag, + newPassphraseFlag, + }, + Action: func(ctx *cli.Context) error { + keyfilepath := ctx.Args().First() + + // Read key from file. + keyjson, err := ioutil.ReadFile(keyfilepath) + if err != nil { + utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err) + } + + // Decrypt key with passphrase. + passphrase := getPassphrase(ctx) + key, err := keystore.DecryptKey(keyjson, passphrase) + if err != nil { + utils.Fatalf("Error decrypting key: %v", err) + } + + // Get a new passphrase. + fmt.Println("Please provide a new passphrase") + var newPhrase string + if passFile := ctx.String(newPassphraseFlag.Name); passFile != "" { + content, err := ioutil.ReadFile(passFile) + if err != nil { + utils.Fatalf("Failed to read new passphrase file '%s': %v", passFile, err) + } + newPhrase = strings.TrimRight(string(content), "\r\n") + } else { + newPhrase = promptPassphrase(true) + } + + // Encrypt the key with the new passphrase. + newJson, err := keystore.EncryptKey(key, newPhrase, keystore.StandardScryptN, keystore.StandardScryptP) + if err != nil { + utils.Fatalf("Error encrypting with new passphrase: %v", err) + } + + // Then write the new keyfile in place of the old one. + if err := ioutil.WriteFile(keyfilepath, newJson, 600); err != nil { + utils.Fatalf("Error writing new keyfile to disk: %v", err) + } + + // Don't print anything. Just return successfully, + // producing a positive exit code. + return nil + }, +} |