Как получить необработанный закрытый ключ из моего файла хранилища ключей Mist?

Я использую кошелек Mist .

Я бы хотел знать:

  • Как я могу получить закрытый ключ моей учетной записи.
  • Как я могу использовать этот закрытый ключ для подписи сообщений.

Ответы (9)

Вы можете использовать функцию MyEtherWallet или MyCrypto (форк MyEtherWallet) автономного кошелька «просмотреть сведения о кошельке» для извлечения закрытого ключа из json-файла кошелька. Не стесняйтесь использовать его автономную версию на компьютере с воздушным зазором, чтобы защитить свой закрытый ключ.

Редактировать: MyCrypto теперь предоставляет эту функцию только в автономной версии кошелька из-за очевидных проблем безопасности, связанных с получением закрытого ключа с интернет-сайта на подключенном компьютере. Итак, вас предупредили, что вы должны делать это только на компьютере с воздушным зазором.

Так что нет способа сделать это прямо в geth?
Как объясняется в ответе Арфи, нет, по соображениям безопасности: github.com/ethereum/go-ethereum/wiki/Managing-your-accounts
Также обратите внимание, что теперь mycrypto.com отключил эту опцию на своем онлайн-сайте из соображений безопасности. Вы все еще можете сделать это с помощью загружаемой офлайн-версии.
Я понимаю. Тем временем MEW, похоже, также отключил это.

Если у вас есть node.js, вы можете сделать это в узле

var keyth=require('keythereum')

//установить keythereum, запустив "npm install keythereum"

var keyobj=keyth.importFromFile('0x...ваш..эфирный..адрес..','./Appdata/roaming/ethereum')

«./Appdata/roaming/ethereum» — это папка, содержащая «хранилище ключей». importFile ищет «хранилище ключей» в этой папке.

var privateKey=keyth.recover('your_password',keyobj) // это занимает несколько секунд

privateKey.toString('шестнадцатеричный')

для macOS используйте «./Library/Ethereum» вместо «./Appdata/roaming/ethereum» (Windows)
Я получаю aes-128-ctr is not available: github.com/ethereumjs/keythereum/issues/73

Я постараюсь предоставить альтернативное решение, более «практическое», чем использование конкретного приложения или JavaScript. Мне кажется, что отсутствие «практических» деталей может быть одной из причин, по которой похожие вопросы продолжают появляться (и в конечном итоге за них проголосовали и перенаправили сюда - см. список связанных вопросов).

Шаги здесь сильно зависят от ответов на этот вопрос .

Цель

Данный

  • ключевой файл
  • его пароль

выход:

  • Необработанный 256-битный целочисленный секрет, который является закрытым ключом.

со ступеньками

  • максимально "голый металл"

Тестовая установка

В основном мы будем использовать оболочку unix/linux и python3 (>3.6 для поддержки scrypt) для упрощения Keccak и scrypt.

Чтобы упростить воспроизведение шагов, мы создаем тестовый закрытый ключ со значением «1» (не делайте этого в рабочей среде).

# create a temp work directory
cd $(mktemp -d)
echo "0000000000000000000000000000000000000000000000000000000000000001" > plain_key.txt
geth --datadir . account import plain_key.txt

Geth запросит новый пароль. Введите простую букву «а» (не используйте в рабочей среде), которая будет использоваться позже при расшифровке.

Geth должен вывести

Address: {7e5f4552091a69125d5dfcb7b8c2659029395bdf}

на который, что интересно, часто поступают средства . Geth также должен был создать файл в папке ./keystore/UTC-<< timestamp >>-7e5f4552091a69125d5dfcb7b8c2659029395bdf:

$ cat keystore/UTC*
{  
   "address":"7e5f4552091a69125d5dfcb7b8c2659029395bdf",
   "crypto":{  
      "cipher":"aes-128-ctr",
      "ciphertext":"f97975cb858242372a7c910de23976be4f545ad6b4d6ddb86e54b7d9b3b1c6a1",
      "cipherparams":{  
         "iv":"7fa01f1d0d6a7117382632028cb0c323"
      },
      "kdf":"scrypt",
      "kdfparams":{  
         "dklen":32,
         "n":262144,
         "p":1,
         "r":8,
         "salt":"859c5d345ee58dfca293950c540016af3a889d0dacb00b8eff2ac2b150f0b07e"
      },
      "mac":"31ccb67e48aba5d64bf727a5c6589fd5857021540d25d12df31323f10ae2bf97"
   },
   "id":"dc74bc44-784b-4293-b1c7-b91e9fd7d6cc",
   "version":3
}

(примечание: приведенный выше вывод был отформатирован для лучшего отображения) На этом настройка теста завершена. Далее расшифровываем приватный ключ известным паролем «а», и сравниваем результат с ожидаемым значением «1».

Расшифровка

Как объяснено в ответах на этот вопрос здесь ,

  • необработанный закрытый ключ зашифрован в «зашифрованном тексте» файла хранилища ключей с заданным алгоритмом и параметрами (например, в нашем примере это aes-128-ctr и начальный вектор).
  • Ключ для расшифровки вышеизложенного не является входным паролем пользователя (т.е. «a» в нашем случае), а является результатом ввода пароля пользователя в указанный алгоритм kdf (функция получения ключа) (в нашем случае это scrypt) .

Получение ключа деривации

В нашем примере функция получения ключа — scrypt. Мы используем Python3 для расшифровки.

python3
>>> import hashlib
>>> dec_key = hashlib.scrypt(bytes('a', 'utf-8'), salt=bytes.fromhex('859c5d345ee58dfca293950c540016af3a889d0dacb00b8eff2ac2b150f0b07e'), n=262144, r=8, p=1, maxmem=2000000000, dklen=32)

Обратите внимание, что мы взяли вводимый пользователем пароль «a» вместе с параметрами «salt», «n», «r», «p», «dklen», значения которых взяты из файла хранилища ключей. Результат должен быть

>>> print(dec_key)
b'\xaeC\xdd\x02\xf98$h\x0b\x00\xfb\x83\x0c\xb9?\x04\xdd5\x91p\xfaM\xd4\xb7Ks\x9f0\xd3\xb1\xec\xd4'

Проверка ключа деривации

Поле «mac» файла хранилища ключей можно использовать для проверки результата последнего шага, который должен быть 32-байтовым массивом. Согласно документации , первые 16 байт предназначены для следующего шага (расшифровки необработанного ключа), вторые 16 байт, объединенные с шифротекстом, после прохождения хеширования Keccak результат должен соответствовать «mac».

>>> validate = dec_key[16:] + bytes.fromhex('f97975cb858242372a7c910de23976be4f545ad6b4d6ddb86e54b7d9b3b1c6a1')
>>> from Crypto.Hash import keccak
>>> keccak_hash=keccak.new(digest_bits=256)
>>> keccak_hash.update(validate)
>>> print(keccak_hash.hexdigest())
31ccb67e48aba5d64bf727a5c6589fd5857021540d25d12df31323f10ae2bf97

Вывод соответствует «mac», что подтверждает правильность введенного пользователем пароля.

Расшифровка производным ключом

Этот шаг представляет собой простую расшифровку AES. Можно использовать множество инструментов, например openssl. Здесь для простоты мы продолжаем с Python3.

>>> from Crypto.Cipher import AES
>>> from Crypto.Util import Counter

Теперь введите значение «начальный вектор» из файла хранилища ключей:

>>> iv_int=int('7fa01f1d0d6a7117382632028cb0c323', 16)
>>> ctr = Counter.new(AES.block_size * 8, initial_value=iv_int)
>>> dec_suite = AES.new(key, AES.MODE_CTR, counter=ctr)

Наконец, введите зашифрованный текст и первые 16 байт ключа деривации:

>>> plain_key = dec_suite.decrypt(bytes.fromhex('f97975cb858242372a7c910de23976be4f545ad6b4d6ddb86e54b7d9b3b1c6a1'))
>>> print(plain_key)
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01'

Это соответствует известному «секретному» значению 1.

Если у нас нет никаких автономных визуальных инструментов для восстановления, я думаю, это означает, что Ethereum мертв, и восстанавливать его бесполезно. Но все же здорово иметь простой ответ на этот вопрос, и, возможно, он поможет людям понять, как работают учетные записи. Спасибо.
Это должно быть dec_suite = AES.new(dec_key,.... Также мне пришлось использоватьplain_key.hex()
Использование dec_suiteне дает мне правильного результата. Переменная macсоответствует, так что до этого момента она верна.
На самом деле это должен быть dec_key[0:16], а не dec_key или ключ.
Реализовано с помощью Go gist.github.com/rikonor/aea81f6834ec15e5cad8db4bdb4031c3.

Я предполагаю, что ваш туманный клиент запускает узел geth в фоновом режиме.

Экспорт незашифрованного ключа намеренно не поддерживается, учитывая риск для конечных пользователей. #1054

К сожалению, не представляется возможным извлечь незашифрованный закрытый ключ.

Если вы получили файл ключа в хранилище ключей, то это ваш закрытый ключ, зашифрованный паролем (плюс другие метаданные). На самом деле нет необходимости экспортировать ваш фактический закрытый ключ ec (если вы не хотите делать с ним математику или я не знаю). Однако вам нужно знать свой пароль. Вы можете скопировать ключ на другой клиент или машину. Если вы разблокируете учетную запись, вы можете использовать этот адрес для подписи транзакций, ... r/cvckff5

Если вы хотите копнуть глубже, вы можете попробовать:

  1. импорт ваших ключей из geth в eth с помощью утилиты ethkey . И после этого вы должны быть в состоянии
  2. сделать простой незашифрованный закрытый ключ видимым с помощью listbare (не рекомендуется) и, наконец,
  3. подписать сообщение вызовом eth_sign rpc .
Не удается ли myetherwallet.com извлечь закрытый ключ из json-файла кошелька?
Да через вкладку «Просмотр сведений о кошельке». Не стесняйтесь запускать оффлайн/локально тоже.
Идите вперед и опубликуйте другой ответ. 3 ответа на вопрос — это хорошо, только 1 ответ на вопрос требует доработки. На исправном сайте вопросы получают несколько ответов, и лучший ответ ставится на первое место.
@ 5chdn Я сделал свой комментарий ответом.

Вы можете использовать инструмент web3 CLI , чтобы сделать это легко:

web3 account extract --keyfile ~/Downloads/keystore-file --password password
коротко и мило!

ethkeyИнструмент ethereum/go-ethereum может сделать это:

> ethkey inspect --private --passwordfile kottipass.txt UTC--2019-01-30T14-49-18.711193885Z--e5dfD67E3d46De4e2C918d894FdC591793492E53
Address:        0xe5dfD67E3d46De4e2C918d894FdC591793492E53
Public key:     046ab6d31f00e43df04226fbf8b16c62eed80eec200ac5d7f247fc3d15f3d1a27f7e9f74a214e7ddcef8a3618853622fd37354080959b17fe36d82a46a8c0aa41e
Private key:    0e459e429c4e36769e0ba7fad5acd3ac8627b9404a1f96f0a003fb22206c2d1d

Вы также можете использовать функции кошелька на EthTools.com.

Этот инструмент загружает сведения о вашем адресе из файла ключей и отображает их в удобной для использования форме.

Экран загрузки кошелька Экран загрузки кошелька

Выберите (или введите) ваш ключевой файл Загрузите ваш ключевой файл

Нажмите «Дополнительно», чтобы просмотреть свой закрытый ключ. Просмотрите свой закрытый ключ

Использование этого инструмента также объясняется здесь в формате видео.

Не кажется хорошим советом использовать онлайн-инструмент для расшифровки закрытого ключа... Простите меня, если я что-то упустил, но как кто-то может быть уверен, что веб-сайт не хранит все введенные данные?
Вы ничего не упускаете. Вы абсолютно правы. Вы должны быть очень осторожны, доверяя свой закрытый ключ веб-службе. Есть способы проверить, что веб-сайт не хранит ваши данные, но это довольно сложно для тех, у кого нет технического образования. В этом случае, поскольку это продукт моей компании, я могу заверить вас, что мы не храним ваши закрытые ключи. Я бы лично всегда советовал иметь холодный кошелек, а затем иметь активный кошелек (который никогда не содержит значительных объемов эфира), который вы используете для взаимодействия с неизвестными сервисами.

Из этого поста: Экспорт закрытого ключа Parity . Эта программа go на github https://github.com/afterether/eacct очень помогла получить закрытый ключ для моей учетной записи Kovan. Большинство других упомянутых ссылок больше не поддерживают получение закрытых ключей, а дают мне только хранилища ключей.

Вы также можете получить список учетных записей с их закрытыми ключами, используя следующий скрипт:

Install keythereum: npm install keythereum

Создайте файл getPrivateKey.js и добавьте в него следующие строки.

const keythereum = require('keythereum');
const async = require('async');
const datadir = 'path/to/datadir/where/keystore/is/located';

const accounts = [ ]; // add the account addresses whose private key has to be extracted

let keyObject, privateKey, count = 0;
let result = [];

async.forEach(accounts, (element, cb) => {
    keyObject = keythereum.importFromFile(element, datadir);
    privateKey = keythereum.recover('accountPassword', keyObject);
    result.push({
        address: element,
        privateKey: privateKey.toString('hex')
    });
    console.log('result: \n', result[count]);
    count++;
    cb();
  },() => {
    console.log('inside final callback of async.forEach: ');
    console.log('result array: ', result);
});

Сценарий использует keythereum , пожалуйста, просмотрите его для более подробной информации.

Execute the script using: node getPrivateKey.js