¿Cómo recuperar la cartera MetaMask? Contraseña perdida, almacenamiento en el almacén, cifrado y análisis forense de datos
Si estás leyendo esto, probablemente hayas perdido el acceso a una cartera de MetaMask y te estés quedando sin opciones. Llevo años recuperando carteras para gente, desde traders de DeFi que han formateado sus portátiles hasta abuelos que han «limpiado» las extensiones de su navegador. Esta guía recoge todo lo que sé sobre cómo MetaMask almacena tus claves, dónde se guardan realmente esos datos en el disco y cómo recuperarlos cuando las cosas salen mal. Nada de esto es teórico. Todas las técnicas que aquí se describen provienen de recuperaciones reales.
Cómo almacena MetaMask tus claves en realidad
Antes de poder recuperar nada, debes saber qué es lo que vas a recuperar. MetaMask no guarda tus claves privadas en un archivo llamado private_keys.txt. Los almacena en un blob cifrado denominado cámara acorazada, que se encuentra en el almacenamiento de extensiones de tu navegador.
Cuando creas un monedero MetaMask y estableces una contraseña, esto es lo que ocurre en segundo plano. MetaMask genera una frase mnemotécnica BIP-39 (tu frase de 12 palabras Frase secreta de recuperación) y lo incluye —junto con cualquier clave privada importada— en una matriz JSON de objetos «keyring». Esa matriz se serializa en una cadena y, a continuación, se cifra utilizando AES-256-GCM con una clave derivada de tu contraseña a través de PBKDF2-HMAC-SHA256. El resultado es un objeto JSON con tres o cuatro campos que se guarda en chrome.storage.local (en los navegadores basados en Chromium) o IndexedDB (en Firefox).
En las versiones anteriores, la caja fuerte cifrada tiene este aspecto:
{"data":"SGFuZGxlIHRoaXMgZW5jcnlwdGVkIGRhdGE=","iv":"MTIzNDU2Nzg5MDEyMzQ1Ng==","salt":"cmFuZG9tMzJieXRlc2FsdHZhbHVlaGVyZQ=="}
Y en las versiones más recientes (posteriores a la v11.16.x), hay un cuarto campo:
{"data":"...","iv":"...","keyMetadata":{"algorithm":"PBKDF2","params":{"iterations":600000}},"salt":"..."}
Eso keyMetadata La diferencia radica en que, en un caso, la recuperación lleva unos minutos, mientras que en el otro lleva semanas. Hablaremos de ello más adelante.
El proceso de cifrado es sencillo, pero es importante comprenderlo con precisión. Tu contraseña en formato UTF-8 se importa como una clave PBKDF2 sin procesar a través de la API Web Crypto. A Sal aleatoria de 32 bytes (generado a partir de crypto.getRandomValues()) se utiliza junto con la contraseña para derivar una clave AES-GCM de 256 bits. A continuación, un IV aleatorio de 16 bytes cifra los datos serializados del llavero. El data El campo contiene tanto el texto cifrado como la etiqueta de autenticación GCM, codificados en Base64. Una peculiaridad que cabe destacar: MetaMask utiliza un IV de 16 bytes para AES-GCM, lo cual no es lo habitual: la norma NIST SP 800-38D recomienda 12 bytes. Esto provoca problemas de interoperabilidad con algunas bibliotecas criptográficas (por ejemplo, OpenSSL de Ruby se niega a funcionar con él).
Cuando desbloqueas MetaMask con tu contraseña, el proceso se invierte. El KeyringController extrae la cadena cifrada del almacén de datos del almacenamiento persistente y la pasa a browser-passworder’s decrypt función que analiza el JSON, extrae la sal, deriva la clave utilizando PBKDF2 con los mismos parámetros, descifra con AES-GCM y vuelve a serializar el resultado en objetos de llavero. Los llaveros descifrados se almacenan solo en la memoria – se almacenan en el memStore (un ObservableStore (por ejemplo) y nunca se guardan en el disco en texto sin cifrar.
Una bóveda descifrada contiene una matriz que suele tener este aspecto:
[
{
"type": "HD Key Tree",
"data": {
"mnemonic": "abandon ability able about above absent ...",
"numberOfAccounts": 3,
"hdPath": "m/44'/60'/0'/0"
}
},
{
"type": "Simple Key Pair",
"data": ["0xabc123..."]
}
]
El HD Key Tree El llavero contiene tu frase mnemotécnica y el número de cuentas derivadas. Simple Key Pair Las entradas son claves privadas importadas individualmente. Si has conectado carteras de hardware, también verás Trezor Hardware y Ledger Hardware Tipos de llaveros: aunque estos solo almacenan rutas de derivación y direcciones públicas, no claves privadas (estas permanecen en el dispositivo físico).
Con Manifest V3 (la arquitectura de service workers que Chrome comenzó a implementar a partir de 2023), MetaMask incorporó la posibilidad de almacenar en caché la clave de cifrado como un JWK exportado, de modo que pueda descifrar de nuevo la bóveda cuando el service worker se reinicie sin necesidad de volver a solicitar la contraseña. El encryptionKey y encryptionSalt los campos aparecen en memStore cuando cacheEncryptionKey está activada.
Dónde guarda MetaMask tus datos en cada plataforma
Encontrar la cartera es la mitad del trabajo. MetaMask almacena los datos en diferentes ubicaciones según el navegador y el sistema operativo, y esas diferencias son importantes a la hora de recuperarlos.
Navegadores basados en Chromium (Chrome, Brave, Edge)
En los navegadores basados en Chromium, chrome.storage.local se mantiene en un Base de datos LevelDB en el disco. El identificador de la extensión determina el nombre de la carpeta.
ID de la extensión de Chrome es nkbihfbeogaeaoehlefnkodbefgpgknn – algo que ningún especialista en recuperación puede olvidar. Valiente utiliza el mismo ID, ya que se instala desde la Chrome Web Store. Borde obtiene su propio ID si se instala desde la Tienda de complementos de Edge: ejbalbakoplchlghecdalmeeeajnimhm. Sin embargo, si un usuario ha instalado MetaMask en Edge a través de la Chrome Web Store (que Edge admite), conserva el ID de Chrome. Esta distinción confunde a la gente constantemente.
Estas son las rutas completas:
Chrome en Windows:C:\Users\<USER>\AppData\Local\Google\Chrome\User Data\Default\Local Extension Settings\nkbihfbeogaeaoehlefnkodbefgpgknn\
Chrome en macOS:~/Library/Application Support/Google/Chrome/Default/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn/
Chrome en Linux:~/.config/google-chrome/Default/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn/
Brave en Windows:C:\Users\<USER>\AppData\Local\BraveSoftware\Brave-Browser\User Data\Default\Local Extension Settings\nkbihfbeogaeaoehlefnkodbefgpgknn\
Brave en macOS:~/Library/Application Support/BraveSoftware/Brave-Browser/Default/Local Extension Settings/nkbihfbeogaeaoehlefnkodbefgpgknn/
Edge en Windows (instalación desde la Tienda de Edge):C:\Users\<USER>\AppData\Local\Microsoft\Edge\User Data\Default\Local Extension Settings\ejbalbakoplchlghecdalmeeeajnimhm\
Un detalle importante: si el usuario tiene varios perfiles de Chrome, sustituye Default con Profile 1, Profile 2, etc. He visto a gente buscando en el perfil equivocado durante horas.
Firefox: algo totalmente distinto
Firefox no utiliza LevelDB. Almacena los datos de las extensiones en IndexedDB, que Firefox implementa sobre SQLite. El ID de la extensión es webextension@metamask.io, pero Firefox asigna un UUID interno único por instalación, algo así como 196319ec-3a5e-4efe-9413-c327a770d874. Lo puedes encontrar en about:debugging en la sección «Este Firefox».
Los datos se encuentran en:
Windows: %APPDATA%\Mozilla\Firefox\Profiles\<PROFILE>\storage\default\moz-extension+++<UUID>^userContextId=4294967295\idb\
macOS: ~/Library/Application Support/Firefox/Profiles/<PROFILE>/storage/default/moz-extension+++<UUID>^userContextId=4294967295/idb/
Linux: ~/.mozilla/firefox/<PROFILE>/storage/default/moz-extension+++<UUID>^userContextId=4294967295/idb/
En el interior del idb/ carpeta, encontrarás archivos binarios con nombres numéricos. Estos son Comprimido con Snappy – No puedes simplemente buscar en ellos con `grep` como si fueran archivos LevelDB. Primero tienes que descomprimirlos con una herramienta como snappy-fox antes de que los datos del almacén puedan extraerse. Este es el error más común que veo a la hora de recuperar datos en Firefox: la gente abre el archivo binario, ve datos ilegibles mezclados con fragmentos de texto reconocible y da por hecho que el almacén está dañado. No es así. Simplemente está comprimido.
Antes de Firefox 63, el almacenamiento de extensiones utilizaba un sencillo archivo JSON llamado storage.js en el directorio de perfiles. Si estás restaurando una instalación muy antigua, busca storage.js o storage.js.migrated.
LevelDB y el archivo 0001.ldb del que todo el mundo pregunta
LevelDB es el motor de almacenamiento clave-valor de Google, y comprender su estructura de archivos es fundamental para la recuperación de MetaMask en cualquier navegador basado en Chromium.
Un directorio LevelDB de MetaMask contiene varios tipos de archivos. El .ldb archivos (Las tablas de cadenas ordenadas, o SSTables) son un sistema de almacenamiento permanente y ordenado de pares clave-valor. .log archivos son el registro de escritura anticipada (Write-Ahead Log), un búfer temporal que almacena las escrituras recientes antes de que se vacíen a .ldb archivos. Hay un MANIFEST-###### metadatos de la base de datos de seguimiento de archivos, un CURRENT archivo que apunta al manifiesto activo, y un LOCK archivo que impide el acceso simultáneo.
Los datos del almacén suelen guardarse en un con números bajos .ldb archivo - 000003.ldb, 000005.ldb, o similar. Según la propia documentación de MetaMask, «debe ser un valor numérico bajo. Si es un número elevado, no se trata de la caja fuerte». El 0001.ldb archivo (o 000001.ldb) es una de las primeras tablas SSTable creadas cuando se inicializó MetaMask por primera vez. A menudo contiene la bóveda original creada durante la creación del monedero.
Extracción de datos del almacén desde .ldb archivos suele ser sencillo en Chromium. Abre el archivo en un editor de texto (Sublime Text, VS Code o incluso Notepad++) y busca la cadena vault. Encontrarás el blob JSON cifrado incrustado en la estructura del registro de LevelDB. Copia todo desde {"data":" hasta el cierre "} – esa es tu caja fuerte.
En Mac o Linux, esta línea de comando es la solución:
LC_ALL="C" egrep -roa 'vault":"(.*?\\"})' ~/Library/Application\ Support/Google/Chrome/Default/Local\ Extension\ Settings/nkbihfbeogaeaoehlefnkodbefgpgknn/ | sed -E 's/.*({.*}).*/\1/g' | head -1
Algo a tener en cuenta: .ldb los archivos pueden utilizar Compresión rápida en bloques de datos. Si la búsqueda de cadenas falla y ves bloques de datos binarios sin sentido, es posible que el bloque de datos que necesitas esté comprimido con Snappy. El .log El archivo, por el contrario, siempre está sin comprimir: datos sin procesar de tipo clave-valor en bloques de 32 KB. Si el .ldb si el método falla, comprueba siempre el .log archivo. La documentación oficial de MetaMask indica lo siguiente: «Si no puedes recuperar tu bóveda mediante el archivo .ldb, comprueba si hay un archivo .log».
Una característica de LevelDB que resulta extremadamente útil para la recuperación: es solo de adición. Las actualizaciones y eliminaciones no modifican los registros existentes, sino que añaden nuevas entradas con números de secuencia más altos. Los registros antiguos permanecen hasta que una compactación los elimina. Esto significa que, si alguien importó un nuevo SRP sobre uno antiguo, es posible que los datos antiguos del almacén sigan existiendo en una versión anterior .ldb archivo que aún no se ha comprimido. He recuperado carteras «sobrescritas» de esta manera más de una vez.
Para la extracción programática, el btcrecover El proyecto incluye extract-metamask-vaults.py, que lee correctamente la base de datos LevelDB y extrae todas las entradas del almacén, incluidas aquellas antiguas que puedan estar ocultas en archivos sin compactar. El cyclone-github/metamask_extractor Esta herramienta hace lo mismo y puede generar resultados directamente en un formato compatible con Hashcat.
Cuando los archivos del almacén se dañan
La corrupción de la bóveda suele deberse a una de estas causas: un fallo del navegador durante una operación de escritura (corte de corriente, pánico del kernel, cierre forzado), una actualización interrumpida de MetaMask que reescribe el almacenamiento en medio del proceso, errores reales del disco (sectores defectuosos, desgaste del SSD) o —algo cada vez más habitual— que el software antivirus ponga en cuarentena los archivos JavaScript de MetaMask, lo que puede dejar la base de datos LevelDB en un estado incoherente, aunque los datos de la bóveda en sí estén intactos.
Sabrás que tu bóveda está dañada cuando el JSON no se analice correctamente. Faltan llaves, cadenas Base64 truncadas, bytes nulos insertados en medio del campo de datos. El descifrador de bóvedas de MetaMask mostrará el mensaje «Problema al descifrar la bóveda» o simplemente fallará sin avisar.
La recuperación depende del tipo y el alcance de la corrupción. Si la estructura JSON está dañada pero los datos cifrados se conservan prácticamente intactos, a menudo se puede reconstruir la bóveda manualmente. El formato es estricto: hay que introducir exactamente el data, iv, y salt campos (además de keyMetadata (para los archivos de cifrado más recientes). Elimina los bytes nulos y los caracteres de control. Comprueba que el data, iv, y salt los valores son válidos en base64. Si el data Si el campo está truncado, sin embargo, tienes un problema – AES-GCM requiere el texto cifrado completo además de su etiqueta de autenticación (los últimos 16 bytes del data (campo) para descifrarlo. Si falta un solo byte, todo el proceso falla.
En el caso de bases de datos LevelDB parcialmente dañadas en las que el .ldb Si los archivos están dañados, prueba a leer el .log Prueba con el archivo en su lugar: tiene un formato más sencillo (bloques secuenciales de 32 KB con encabezados de 7 bytes) y puede contener una copia más reciente del almacén que haya sobrevivido al incidente de corrupción. Si ninguno de los dos métodos funciona, a veces se pueden utilizar bibliotecas de análisis de LevelDB en Python (CCL Solutions Group ha publicado implementaciones en Python puro para el análisis de LevelDB, la descompresión de Snappy y la deserialización de V8) para extraer con precisión registros de archivos de base de datos dañados, saltándose los bloques corruptos.
En un mismo directorio de LevelDB pueden coexistir varias SRP. Si un usuario ha importado una nueva frase de semillas, es posible que la entrada antigua del almacén permanezca en un archivo independiente .ldb archivo o incluso dentro del mismo archivo en una posición diferente. Busca siempre todos los casos del patrón de bóveda, no solo el primero.
El problema de los archivos sobrescritos y cómo solucionarlo
Esta es la situación que más disgusto causa. Alguien desinstala MetaMask —quizá estaba intentando solucionar un problema, quizá estaba «limpiando» su navegador, quizá no se dio cuenta de lo que estaba haciendo—. En los navegadores basados en Chromium, al desinstalar una extensión elimina toda la carpeta de datos de la extensión, incluyendo todos .ldb, .log, y los archivos «manifest». En Firefox, el moz-extension+++<UUID> La carpeta se elimina y, dado que cada reinstalación genera un nuevo UUID, la nueva instalación no afectará a la ubicación anterior (pero esta ya no existe).
La propia documentación de MetaMask es muy clara al respecto: «Los datos de la extensión del navegador se eliminan al desinstalarla. Por lo general, esto significa que los datos de tu caja fuerte se pierden».
La palabra «generalmente» tiene un gran peso. Los datos se borran lógicamente —el sistema de archivos marca esos sectores como libres—, pero los bytes concretos no se ponen a cero de inmediato. En un disco duro tradicional, los datos persisten hasta que esos sectores son reutilizados por nuevos archivos. En un SSD, los comandos TRIM pueden hacer que los datos borrados sean irrecuperables en cuestión de minutos, a veces incluso de segundos.
La primera regla para recuperar un almacén sobrescrito: deja de usar el ordenador inmediatamente. Cada nuevo archivo que se guarde en la unidad podría sobrescribir los sectores donde antes se encontraba tu almacén. Si es posible, extrae la unidad y conéctala en modo de solo lectura en otro equipo.
Herramientas de recuperación para este caso, en el orden en que las utilizo:
- Nuestro software personalizado (multipropósito) para la recuperación de archivos borrados lógicamente
- extundelete o ext4magic para sistemas de archivos ext3/ext4 de Linux
- Búsqueda en el disco sin procesar como último recurso:
grep -rboa "vault" /dev/sdXpara buscar cadenas de la bóveda en el dispositivo de disco sin procesar - Nuestras herramientas a medida para la recuperación de archivos cuando se han perdido los metadatos del sistema de archivos: configúralo para que busque
{"data":"patrones
He recuperado carteras de discos duros que se habían desinstalado semanas antes. En los SSD, la tasa de éxito se reduce drásticamente tras tan solo unas horas de uso continuado. Reinstalar MetaMask es lo peor que puedes hacer, ya que crea una nueva base de datos LevelDB en el mismo directorio, lo que podría sobrescribir los sectores antiguos.
Firefox tiene una ventaja en este sentido. Dado que cada instalación recibe un nuevo UUID, al reinstalarlo se crean archivos en una nueva ruta de directorio. El antiguo moz-extension+++<OLD-UUID> Los datos, aunque se haya eliminado la carpeta, no se sobrescribirán con los archivos de la nueva instalación. También hay dos opciones ocultas de Firefox: extensions.webextensions.keepUuidOnUninstall y extensions.webextensions.keepStorageOnUninstall – que, si se configura en true en about:config Antes de desinstalarla, evita que el navegador borre los datos almacenados por la extensión. Pero nadie configura esto de forma preventiva.
MetaMask en el móvil es algo completamente distinto
La aplicación móvil MetaMask está desarrollada con React Native y almacena los datos de una forma totalmente diferente a la extensión del navegador. La bóveda cifrada pasa por @react-native-async-storage/async-storage, que utiliza backends específicos para cada plataforma.
En Android, AsyncStorage suele escribir en un Base de datos SQLite en /data/data/io.metamask/databases/RKStorage. Esta ruta requiere acceso de root para poder leer directamente. El cifrado del almacén utiliza el mismo método de clave derivada de PBKDF2, pero con diferencias importantes respecto a la extensión de escritorio: la aplicación móvil, tradicionalmente, solo utiliza 5.000 iteraciones de PBKDF2 y cifra con AES-CBC en lugar de AES-GCM. Esto significa que las cajas fuertes móviles no son intercambiables con las de escritorio, aunque la contraseña sea la misma.
En iOS, los datos se almacenan en el entorno aislado de la aplicación bajo <AppSandbox>/Documents/. Para la recuperación de una copia de seguridad de iCloud, la ruta correspondiente es Apps → MetaMask → Documents → persistStore → persist-root – Necesitarás una herramienta como iMazing para explorar una copia de seguridad de iOS en un Mac. Que este método funcione depende de si el usuario tenía activada la copia de seguridad de iCloud mientras MetaMask estaba en funcionamiento; además, al parecer, algunos cambios introducidos por Apple han impedido que este método funcione de forma intermitente.
La aplicación móvil de MetaMask también incorpora una SecureKeychain módulo (basado en react-native-keychain) que almacena la contraseña del monedero del usuario en el Llavero de iOS o en el Almacén de claves de Android para el desbloqueo biométrico. Una auditoría de seguridad reveló que SecureKeychain añade una capa adicional de cifrado utilizando una sal «foxCode», que resultó ser la cadena codificada de forma fija "encrypt". El equipo de MetaMask reconoció que se trataba de una estrategia de defensa en profundidad y no de un secreto crítico para la seguridad.
El principal reto de la recuperación de datos en dispositivos móviles es que No es posible extraer el almacén de forma manual equivale a encontrar .ldb archivos en el escritorio. No puedes conectarte por SSH a tu iPhone y buscar cadenas de Vault con grep. A partir de MetaMask para móviles v6.3.0, la aplicación incluye una función de recuperación automática del almacén que se activa cuando se detecta un error; sin embargo, si se elimina la aplicación, los datos locales del almacén se pierden a menos que se disponga de una copia de seguridad del dispositivo. Los mecanismos de copia de seguridad de Android son especialmente poco fiables a la hora de guardar todos los datos internos de la aplicación. La postura oficial de MetaMask es recomendar trasladar los datos a un nuevo SRP en lugar de recurrir a la función de recuperación de la caja fuerte de Android.
El cambio en el número de iteraciones de PBKDF2 que dejó inoperativas todas las herramientas de recuperación
Durante años, MetaMask utilizó 10 000 iteraciones de PBKDF2 – el valor predeterminado fijado en el browser-passworder biblioteca. Todas las herramientas de recuperación, todos los módulos de Hashcat y todos los scripts de fuerza bruta se ajustaron para 10 000 iteraciones. Pero a finales de 2023 o principios de 2024, todo cambió.
El @metamask/browser-passworder La versión 4.2.0 de la biblioteca (publicada el 13 de noviembre de 2023) introdujo la compatibilidad con opciones configurables de derivación de claves. El nuevo valor predeterminado de la biblioteca pasó a ser 900 000 iteraciones, pero la extensión de MetaMask la configuró para que utilizara 600 000 iteraciones – En consonancia con la recomendación de OWASP para 2023 relativa a PBKDF2-HMAC-SHA256. Por la extensión MetaMask v11.16.11 (confirmado en un número de Hashcat de junio de 2024), se estaban creando nuevas cajas fuertes con 600 000 iteraciones y la nueva keyMetadata campo.
Esto supone un aumento de 60 veces en el coste computacional por intento de contraseña. Un ataque de fuerza bruta que antes tardaba un día con 10 000 iteraciones ahora tarda dos meses con 600 000 iteraciones en el mismo hardware. La comunidad de Hashcat tuvo que desarrollar kernels personalizados —el modo 26620, aportado por cyclone— para gestionar el nuevo formato. El modo estándar 26600 tenía 10 000 iteraciones codificadas de forma fija.
Es importante destacar que las claves antiguas NO se vuelven a cifrar automáticamente. Si creaste tu monedero en 2021, tu almacén sigue utilizando 10 000 iteraciones, a menos que MetaMask haya activado explícitamente un recifrado (el updateVault existe una función para este fin, pero no está claro con qué frecuencia la invoca MetaMask al desbloquear). Puedes saber con qué versión estás trabajando por la presencia o ausencia de la keyMetadata campo. No keyMetadata¿Son 10 000 iteraciones? ¿Tiene keyMetadata con "iterations": 600000¿Es el nuevo formato?
A continuación se muestra la cronología completa de las versiones de la biblioteca de cifrado relevantes para la recuperación:
- browser-passworder v1.x–v2.x (antes de 2022): 10 000 iteraciones, valor fijo. Publicado sin el
@metamaskámbito. - v3.0.0 (Agosto de 2022): Se ha cambiado el nombre a
@metamask/browser-passworder. No hay cambios en la iteración. - v4.2.0 (Noviembre de 2023): Añadido
keyMetadataCompatibilidad. El valor predeterminado de la encriptación se ha cambiado a 900 000 iteraciones.keyFromPasswordcompatible con versiones anteriores a partir de la 10 000. - v4.3.0 (Noviembre de 2023): Añadido
isVaultUpdatedpara comprobar si la cámara acorazada cumple los parámetros establecidos. - v5.0.0 (abril de 2024): Node.js v16 como mínimo. No hay cambios en la criptografía.
- v6.0.0 (diciembre de 2024): Node.js v18.18 como mínimo. No hay cambios en la criptografía.
Para los especialistas en recuperación: comprueba siempre primero el formato del almacén. De ello depende todo tu enfoque.
La política de contraseñas de MetaMask y lo que implica para los ataques de fuerza bruta
MetaMask exige que la contraseña tenga una longitud mínima de 8 caracteres. Eso es todo. No exige mayúsculas, números ni caracteres especiales. La extensión muestra un indicador visual de seguridad («Débil» / «Buena»), pero no bloquea las contraseñas débiles que cumplen con la longitud mínima. Tampoco hay una longitud máxima; se admiten caracteres Unicode. Esta política está en vigor desde al menos principios de 2018 (referenciado en el issue n.º 3515 de GitHub).
Varios sitios web de terceros afirman erróneamente que MetaMask exige el uso de mayúsculas, minúsculas, números y caracteres especiales. Esto es incorrecto. El único requisito imprescindible es que la contraseña tenga 8 caracteres.
Para la recuperación por fuerza bruta, esto es de vital importancia. Una contraseña de 8 caracteres compuesta únicamente por minúsculas tiene un espacio de claves de aproximadamente 208 000 millones de combinaciones (26^8). Frente a una caja fuerte antigua con 10 000 iteraciones, hashcat en una GPU moderna puede probar miles de hash por segundo, lo que hace que sea descifrable en cuestión de días. Frente a una caja fuerte de 600 000 iteraciones, el tiempo se multiplica por 60. ¿Una contraseña segura de más de 12 caracteres con mayúsculas, minúsculas y símbolos? Prácticamente indescifrable frente a cualquiera de los dos formatos con el hardware actual.
La herramienta de recuperación práctica más recomendable es btcrecover – La propia MetaMask lo recomienda para usuarios que tengan una idea aproximada de su contraseña. Admite la adivinación basada en tokens y en patrones, lo que te permite definir una plantilla como "my" + [dog|cat|bird] + [2019|2020|2021] + ["!"|"@"|"#"] y probar de forma eficiente todas las permutaciones. En el caso de los ataques acelerados por GPU, el modo 26600 de hashcat se encarga de las cajas fuertes antiguas, el modo 26610 se encarga de las cajas fuertes de dispositivos móviles y el modo 26620 (o un 26600 recompilado con iteraciones actualizadas) se encarga del nuevo formato de 600 000 iteraciones.
Las vías de derivación y la epidemia de los «fondos desaparecidos»
La ruta de derivación es el origen de la mayoría de los problemas relacionados con la desaparición de fondos. MetaMask utiliza la ruta estándar BIP-44 para Ethereum: m/44'/60'/0'/0. Las cuentas se obtienen incrementando el índice final: m/44'/60'/0'/0/0 (primer relato), m/44'/60'/0'/0/1 (segundo), m/44'/60'/0'/0/2 (tercero), y así sucesivamente. Esta ruta es válida para todas las cadenas compatibles con EVM: la misma dirección en Ethereum, Polygon, Arbitrum y BSC.
El problema es que no todo el mundo utiliza la misma ruta. Ledger Live usos m/44'/60'/x'/0/0, incrementando el account campo en lugar del address_index. El legado de Ledger (la antigua ruta MEW/MyCrypto) utiliza m/44'/60'/0'/x – solo cuatro niveles en lugar de cinco. La primera dirección (m/44'/60'/0'/0/0) es idéntica en MetaMask, Ledger Live y Trezor. Pero el A partir de la segunda cuenta, las versiones difieren por completo, ya que cada monedero incrementa un componente diferente de la ruta.
Esto da lugar a un problema muy concreto: alguien restaura la frase de semillas de su Ledger en MetaMask, ve su primera cuenta y su saldo, luego añade una segunda cuenta y ve… cero. Los fondos no han desaparecido. Están en la dirección derivada de m/44'/60'/1'/0/0 (al estilo de Ledger Live), pero MetaMask está estudiando m/44'/60'/0'/0/1. Claves totalmente diferentes, direcciones totalmente diferentes.
La ruta de derivación predeterminada de Ethereum en Trezor coincide con la de MetaMask: m/44'/60'/0'/0/x. Por lo tanto, la recuperación de Trezor a MetaMask suele funcionar para todas las cuentas. Los problemas entre monederos se dan principalmente entre Ledger y MetaMask, y entre Ledger y Trezor.
Para encontrar fondos en la ruta de derivación «incorrecta», tus opciones son:
- Escríbenos a contact@cryptorecovery.io y haremos todo lo posible por ayudarte.
- MyEtherWallet (MEW): Admite rutas de derivación personalizadas mediante la opción «Añadir ruta». Introduzca manualmente
m/44'/60'/1'/0/0,m/44'/60'/2'/0/0, etc., para comprobar direcciones al estilo de Ledger Live. - MyCrypto: Compatibilidad con rutas de derivación personalizadas similares.
- Herramienta BIP-39 de Ian Coleman (funciona sin conexión): Introduce la frase mnemotécnica, selecciona ETH, cambia entre las pestañas de BIP-44 y ajusta manualmente los componentes de la ruta.
- btcrecover: Permite automatizar las pruebas en diferentes esquemas de rutas de derivación.
Una limitación frustrante: la integración de Trezor en MetaMask no admite rutas de derivación personalizadas. Se incorporó una opción de ruta de derivación personalizada para Ledger (PR n.º 9367), pero según la información más reciente, la equivalente para Trezor (incidencia de GitHub n.º 11197) sigue abierta. Si intentas acceder a cuentas derivadas de Ledger a través de MetaMask + Trezor, tendrás que utilizar MEW o MyCrypto en su lugar.
MetaMask y Trezor: una relación conflictiva
La integración de MetaMask y Trezor funciona a través de Trezor Bridge – un proceso en segundo plano instalado localmente (trezord) que escucha en http://127.0.0.1:21325/ y sirve de puente entre el entorno aislado del navegador y el acceso al hardware USB. Puedes comprobar si se está ejecutando pulsando http://127.0.0.1:21325/status/.
El motivo más habitual del fallo es aparentemente sencillo: Trezor Suite está abierta. Trezor Suite bloquea la conexión USB con el dispositivo, lo que impide que MetaMask se comunique con él. Hay que cerrar Trezor Suite por completo, no basta con minimizarla, sino que hay que cerrarla desde la bandeja del sistema. Calculo que esto representa el 40 % de las incidencias del tipo «MetaMask no encuentra mi Trezor» que he visto.
Otros problemas habituales y sus soluciones:
«Buscando tu Trezor…» girando sin parar – Comprueba que Bridge esté instalado y trezord está en funcionamiento. Prueba con otro cable USB y otro puerto. Desactiva la VPN, el cortafuegos y las extensiones del navegador (los bloqueadores de anuncios y las extensiones de privacidad suelen causar interferencias). El modo incógnito evita los conflictos entre extensiones.
«Llamada al dispositivo en curso»: otra aplicación o pestaña del navegador ya se está comunicando con el Trezor. Cierra todas las demás pestañas y aplicaciones que puedan estar accediendo al dispositivo.
Limitaciones de WebUSB: Firefox no es compatible en absoluto con WebUSB, lo que significa que la conectividad de Trezor en Firefox depende totalmente de Bridge. Chrome, Brave y Edge funcionan a través de la implementación de WebUSB/WebHID de Chromium.
Advertencia sobre la ruta de derivación en el Trezor Safe 5: algunos usuarios informan de que aparece el mensaje «Ruta de derivación incorrecta para la cuenta seleccionada. m/44’/60’/0’/0» en la pantalla del Trezor durante la validación de la transacción. Por lo general, esta advertencia puede ignorarse sin problema, ya que el monedero funciona correctamente a pesar del mensaje. Se trata de un problema de carácter estético relacionado con la forma en que el firmware del Trezor valida las rutas que no siguen el formato estándar.
En 2025, Trezor comenzó a integrar la funcionalidad de Bridge directamente en Trezor Suite. Esta transición provocó una serie de problemas de conectividad, ya que algunos usuarios necesitaban que Suite se ejecutara en segundo plano para las conexiones con MetaMask, mientras que otros necesitaban que estuviera completamente cerrada. Consulta Trezor Suite → Ajustes → Aplicación → Trezor Connect para ver la configuración correspondiente.
Cuando MetaMask se conecta a un Trezor, las cuentas resultantes son fundamentalmente diferentes de las cuentas de la cartera de software de MetaMask. Las cuentas derivadas de Trezor solo almacenan claves públicas y rutas de derivación en la bóveda; las claves privadas permanecen en el dispositivo físico. MetaMask puede mostrar saldos (en modo de solo lectura a través de claves públicas) sin que Trezor esté conectado, pero no puede firmar transacciones sin que el dispositivo físico esté presente. Si se utilizó una frase de contraseña al crear las cuentas de Trezor, se debe introducir exactamente la misma frase de contraseña para regenerar las mismas direcciones.
Técnicas de recuperación que realmente funcionan en la práctica
Tras cientos de recuperaciones, estas son las situaciones con las que me encuentro más a menudo y cómo las afronto.
Situación 1: Tienes la contraseña, has perdido la frase de recuperación, pero la extensión sigue instalada
Esta es la más fácil. Abre la página de fondo de MetaMask a través de chrome://extensions → Modo de desarrollador → haz clic en «service worker» (MV3) o «página en segundo plano» (MV2). En la consola:
chrome.storage.local.get('data', result => {
console.log(result.data.KeyringController.vault);
});
Copia el JSON del almacén y pégalo en el Descriptor de MetaMask Vault (metamask.github.io/vault-decryptor), introduce tu contraseña y te mostrará tu frase mnemotécnica y cualquier clave privada importada. El Vault Decryptor fue creado por Dan Finlay, cofundador de MetaMask; también admite .ldb archivos directamente mediante la función de carga de archivos.
Escenario 2: Se dispone de la contraseña; la extensión se ha desinstalado, pero es posible que los datos sigan estando en el disco
Ve al directorio de datos de la extensión. Si la carpeta sigue ahí (a veces la desinstalación no borra todo por completo, o el usuario solo ha desactivado la extensión en lugar de eliminarla), coge el .ldb y .log archivos. Extrae el archivo utilizando grep, un editor de texto o btcrecover’s extract-metamask-vaults.py. Descifra el archivo con el programa Vault Decryptor.
Si la carpeta ha desaparecido, ponte en contacto con nosotros en contact@cryptorecovery.io y te ayudaremos con el análisis forense del disco.
También puedes montar la unidad como de solo lectura y realizar búsquedas directas en el disco en busca de patrones de cadenas de la bóveda. En Linux: grep -rboa '{"data":"' /dev/sdX. El éxito depende en gran medida de la actividad del disco que se haya producido tras el borrado y de si la unidad es SSD o HDD.
Escenario 3: Olvidé la contraseña, pero tengo el archivo de la caja fuerte
Se trata de un caso de fuerza bruta. Extrae el archivo «vault» y conviértelo al formato de Hashcat utilizando metamask2hashcat.py o cyclone-github/metamask_extractor. A continuación, ejecuta hashcat (modo 26600 para las cajas fuertes antiguas, 26620 para las nuevas) o btcrecover con un archivo de tokens que describa lo que recuerdas de la contraseña. Si sabes que tu contraseña era algo así como «myDog» más un año más un símbolo, btcrecover puede probar esas combinaciones de forma eficaz.
Escenario 4: Recuperación de Firefox
Encuentra el UUID de MetaMask en about:debugging. Accede al directorio de almacenamiento. Descomprime los archivos binarios de IndexedDB utilizando snappy-fox:
./snappy-fox input_file.snappy output.txt
Busca el archivo JSON del almacén en la carpeta de resultados descomprimidos. A continuación, sigue con el programa «Vault Decryptor». El JesseBusman/FirefoxMetamaskWalletSeedRecovery Este script de Python automatiza todo el proceso: analiza el perfil de Firefox, localiza los datos del almacén y genera un archivo JSON formateado listo para su descifrado.
Escenario 5: Parece que faltan fondos tras la importación de fondos iniciales
Comprueba las rutas de derivación. Si importas una semilla de Ledger a MetaMask, a partir de la segunda cuenta aparecerán direcciones diferentes y saldos nulos. Utiliza MEW o MyCrypto con rutas de derivación personalizadas para localizar los fondos en Ledger Live (m/44'/60'/x'/0/0) o Ledger Legacy (m/44'/60'/0'/x) rutas. Si se ha utilizado una frase de contraseña de Trezor, asegúrate de introducir exactamente la misma frase de contraseña, ya que una frase diferente genera un conjunto de direcciones totalmente distinto a partir de la misma semilla.
Herramientas forenses que conviene tener en tu kit
- Descriptor de MetaMask Vault – oficial, puede funcionar sin conexión, admite conexiones directas
.ldbcarga de archivos - btcrecover: recuperación de contraseñas mediante coincidencia de patrones, recomendado por MetaMask
- hashcat – Ataque de fuerza bruta acelerado por GPU (modos 26600, 26610, 26620)
- snappy-fox – Descompresión rápida de Firefox
- Herramientas de Python de CCL Solutions Group: análisis sintáctico de LevelDB en Python puro, descompresión de Snappy y deserialización de V8
Conclusión: qué distingue a las recuperaciones exitosas de los fracasos
La diferencia entre recuperar una cartera y perderla para siempre casi siempre se reduce a lo que ocurrió en los primeros minutos tras descubrir el problema. La acción más perjudicial es reinstalar MetaMask en el mismo perfil del navegador, ya que sobrescribe el directorio LevelDB con archivos nuevos. La segunda acción más perjudicial es seguir utilizando el ordenador con normalidad en un SSD tras borrar la bóveda, lo que activa la función TRIM e imposibilita la recuperación a nivel de sector.
Si hay tres cosas que debes recordar de esta guía: haz una copia de seguridad de tu frase de semillas en papel, ten en cuenta que tu almacén se encuentra en una carpeta específica que puedes copiar y conservar, y, si algo sale mal, deja de usar ese ordenador inmediatamente antes de intentar cualquier recuperación. El cifrado es sólido —AES-256-GCM con 600 000 iteraciones PBKDF2 no se puede descifrar por fuerza bruta a menos que la contraseña sea débil—, pero los datos en sí son sorprendentemente frágiles. Son solo unos pocos kilobytes en una base de datos LevelDB, y pueden desaparecer con un solo clic para limpiar el navegador.
Todas las carteras que no he podido recuperar tenían la misma causa principal: el usuario siguió utilizando el dispositivo después de perder los datos. Todas las carteras que he recuperado con éxito eran aquellas en las que los datos aún se encontraban en el disco —a veces en lugares insospechados, a veces en múltiples copias gracias a la arquitectura de solo adición de LevelDB—, pero siempre porque alguien se detuvo a pensar antes de actuar.
Si necesitas ayuda para recuperar tu monedero Metamask, ponte en contacto con nosotros por correo electrónico: contact@cryptorecovery.io para recibir asesoramiento profesional y gratuito, o visita nuestra página de contacto
