changepassphrase.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package main
  2. import (
  3. "fmt"
  4. "io/ioutil"
  5. "strings"
  6. "github.com/ethereum/go-ethereum/accounts/keystore"
  7. "github.com/ethereum/go-ethereum/cmd/utils"
  8. "gopkg.in/urfave/cli.v1"
  9. )
  10. var newPassphraseFlag = cli.StringFlag{
  11. Name: "newpasswordfile",
  12. Usage: "the file that contains the new passphrase for the keyfile",
  13. }
  14. var commandChangePassphrase = cli.Command{
  15. Name: "changepassphrase",
  16. Usage: "change the passphrase on a keyfile",
  17. ArgsUsage: "<keyfile>",
  18. Description: `
  19. Change the passphrase of a keyfile.`,
  20. Flags: []cli.Flag{
  21. passphraseFlag,
  22. newPassphraseFlag,
  23. },
  24. Action: func(ctx *cli.Context) error {
  25. keyfilepath := ctx.Args().First()
  26. // Read key from file.
  27. keyjson, err := ioutil.ReadFile(keyfilepath)
  28. if err != nil {
  29. utils.Fatalf("Failed to read the keyfile at '%s': %v", keyfilepath, err)
  30. }
  31. // Decrypt key with passphrase.
  32. passphrase := getPassphrase(ctx)
  33. key, err := keystore.DecryptKey(keyjson, passphrase)
  34. if err != nil {
  35. utils.Fatalf("Error decrypting key: %v", err)
  36. }
  37. // Get a new passphrase.
  38. fmt.Println("Please provide a new passphrase")
  39. var newPhrase string
  40. if passFile := ctx.String(newPassphraseFlag.Name); passFile != "" {
  41. content, err := ioutil.ReadFile(passFile)
  42. if err != nil {
  43. utils.Fatalf("Failed to read new passphrase file '%s': %v", passFile, err)
  44. }
  45. newPhrase = strings.TrimRight(string(content), "\r\n")
  46. } else {
  47. newPhrase = promptPassphrase(true)
  48. }
  49. // Encrypt the key with the new passphrase.
  50. newJson, err := keystore.EncryptKey(key, newPhrase, keystore.StandardScryptN, keystore.StandardScryptP)
  51. if err != nil {
  52. utils.Fatalf("Error encrypting with new passphrase: %v", err)
  53. }
  54. // Then write the new keyfile in place of the old one.
  55. if err := ioutil.WriteFile(keyfilepath, newJson, 600); err != nil {
  56. utils.Fatalf("Error writing new keyfile to disk: %v", err)
  57. }
  58. // Don't print anything. Just return successfully,
  59. // producing a positive exit code.
  60. return nil
  61. },
  62. }