Текущее местоположение: Главная / BIP39, BIP32 и частичное восстановление фразы / Текст статьи

Как извлечь приватный ключ из старых файлов данных MetaMask: безопасное руководство

Как извлечь приватный ключ из старых файлов данных MetaMask: безопасное руководство

Введение

Если у вас остался старый профиль MetaMask, резервная копия расширения или папка LevelDB, восстановить доступ к аккаунту можно через извлечение приватного ключа из старых файлов данных MetaMask. Делайте это только для собственного кошелька и только при наличии пароля.

MetaMask хранит ключи не в открытом виде, а внутри зашифрованного vault. Нужно найти vault, расшифровать его и извлечь privateKey или seed-фразу.

Где лежат данные

ID расширения MetaMask: nkbihfbeogaeaoehlefnkodbefgpgknn. Типичные пути:

  • Windows Chrome: %LOCALAPPDATA%/Google/Chrome/User Data/Default/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn
  • macOS Chrome: ~/Library/Application Support/Google/Chrome/Default/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn
  • Linux Chrome: ~/.config/google-chrome/Default/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn
  • Firefox: профиль/storage/default/moz-extension+++

Сначала закройте браузер и сделайте копию всей папки. Работайте только с копией.

Поиск vault в LevelDB

В старых версиях MetaMask vault часто лежал под ключом data. Внутри были поля data, iv, salt. Их можно найти так:

strings *.ldb *.log | grep -i -E 'vault|salt|iv|data'

Или через Python и plyvel:

расшифровка vault MetaMask

import plyvel

db = plyvel.DB('путь_к_копии', create_if_missing=False)

for key, value in db:

print(key, value)

db.close()

Сохраните найденный объект как vault.json. Если он вложен строкой, выполните двойной JSON-парсинг.

Расшифровка vault

Старый MetaMask обычно использует PBKDF2-SHA256, 10 000 итераций, 32-байтовый ключ и AES-256-CBC. Пример на Node.js:

const crypto = require('crypto');

const fs = require('fs');

const vault = JSON.parse(fs.readFileSync('vault.json', 'utf8'));

извлечение приватного ключа MetaMask

const password = process.argv[2];

function hexToBuf(hex) {

return Buffer.from(hex.replace(/^0x/, ''), 'hex');

}

const salt = hexToBuf(vault.salt);

const iv = hexToBuf(vault.iv);

const data = hexToBuf(vault.data);

const key = crypto.pbkdf2Sync(password, salt, 10000, 32, 'sha256');

const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);

let decrypted = decipher.update(data, undefined, 'utf8');

decrypted += decipher.final('utf8');

console.log(decrypted);

怎么从老旧的MetaMask数据文件中提取私钥

Запуск: node decrypt.js 'ваш_пароль'. Если ошибка bad decrypt, проверьте пароль и версию vault. Новые версии могут использовать AES-256-GCM.

Поиск приватного ключа

После расшифровки ищите в JSON поля privateKey, mnemonic, keyrings и accounts. Если есть privateKey, импортируйте его в новый кошелёк. Если только mnemonic, восстановите кошелёк по seed-фразе или выведите ключ через BIP39/BIP44 по пути m/44'/60'/0'/0/0. Для следующих аккаунтов меняется последний индекс.

Импорт и очистка

Импортируйте ключ или seed-фразу в новый MetaMask или аппаратный кошелёк. Переведите средства на новый адрес, если есть риск компрометации. Удалите vault.json, расшифрованные файлы, временные копии LevelDB и историю команд. Храните seed-фразу офлайн.

Меры безопасности

  • Не используйте онлайн-декрипторы и случайные утилиты.
  • Проверяйте open-source код и работайте офлайн.
  • Не отправляйте vault, пароль, seed-фразу или privateKey никому.
  • Без пароля расшифровка vault практически невозможна.
  • Извлечение ключей из чужого кошелька незаконно.

Вывод

Извлечение приватного ключа из старых файлов MetaMask требует копии данных, пароля и правильного декриптора. Работайте офлайн и не рискуйте seed-фразой.