Введение
Если у вас остался старый профиль 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:

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'));

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);

Запуск: 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-фразой.