PBKDF2, Password-Based Key Derivation Function 2, transforma una entrada de contraseña y un parámetro adicional llamado salt en una clave derivada. El resultado también depende del número de repeticiones, la función de cálculo y la longitud solicitada. Entradas y ajustes idénticos dan el mismo resultado. BIP39 utiliza la variante concreta PBKDF2-HMAC-SHA512; otros usos pueden elegir parámetros diferentes.
Las palabras de recuperación forman la entrada llamada password. Salt es otra entrada: el texto literal "mnemonic" seguido de la passphrase, una contraseña adicional opcional. No se intercala ningún separador ni otra copia de las palabras. Sin passphrase, salt sigue siendo "mnemonic", no un texto vacío. Ambas entradas pasan por NFKD, que unifica ciertas representaciones de caracteres, y por la codificación UTF-8. BIP39 usa HMAC-SHA512, 2048 repeticiones y una salida de 64 bytes, o 512 bits. Ese resultado es el seed; salt no es otra copia que debas crear. [1]
Internamente se usa HMAC, un cálculo que combina una clave con un mensaje. La misma entrada de contraseña sigue siendo la clave en cada ronda. El primer resultado intermedio usa salt y el número de bloque de salida; las rondas siguientes procesan el resultado anterior. Los resultados se combinan mediante XOR, una operación entre bits correspondientes. HMAC-SHA512 devuelve 64 bytes, por lo que BIP39 necesita un solo bloque. Aplicar únicamente SHA-512 al texto 2048 veces sería otro cálculo y daría otro resultado. [2] [1]
Imagina recuperar los fondos en otra cartera. Para obtener el mismo seed necesita los mismos datos normalizados y los mismos ajustes. Aumentar las 2048 repeticiones prescritas no mejora la recuperación: se aparta de BIP39 y produce otro resultado. Tampoco es neutro traducir las palabras a otra lista. Recuperar exige coincidencia, no una modificación propia del algoritmo. [1]
Repetir el cálculo encarece cada intento, pero no genera nueva aleatoriedad independiente. Un atacante que conoce tus palabras y dispone de datos para reconocer la cartera correcta puede probar passphrases débiles sin conexión, en su propio ordenador. Un seed largo de 512 bits no implica 512 bits de imprevisibilidad. Tampoco 2048 es una recomendación general para sistemas nuevos; aquí forma parte de un estándar concreto de recuperación. [2] [1]
El checksum de BIP39 ayuda a detectar palabras mal copiadas. PBKDF2 responde a otra pregunta: cómo calcular el seed con las entradas recibidas. Ese cálculo no confirma que la passphrase corresponda a tu cartera original. Después, el seed puede pasar a BIP32, un método para derivar toda una familia de claves. Comprobar el registro, convertirlo en seed y crear las claves son pasos relacionados, pero no intercambiables. [1]
Un desarrollador puede comparar los resultados con vectores de prueba públicos: entradas conocidas y salidas esperadas. BIP39 publica los datos aleatorios originales, las palabras y el seed completo para la passphrase de prueba TREZOR. Una implementación correcta debe reproducirlo, incluidas las reglas NFKD. Para esta prueba no hace falta tu copia real. Nunca uses esos ejemplos públicos para guardar dinero: todo el mundo los conoce. Superar la prueba del cálculo tampoco demuestra la seguridad de toda la aplicación. [1]
Para obtener la imagen más completa, lee esta entrada junto con BIP 39, BIP39 passphrase, Seed Generation, HD Wallet. También enlazan con esta entrada BIP39 passphrase.