Herramienta de navegador
Saca tus claves secretas de Google Authenticator.
Google Authenticator te muestra un código QR con todas las cuentas de tu teléfono y después no te da ninguna forma de leerlo. Captura ese código, arrástralo aquí y obtienes la clave secreta en base32 y el enlace otpauth de cada una.
La imagen nunca sale de esta pestaña. Leer el código QR, interpretarlo y generar los códigos: todo ello ocurre en tu navegador, y puedes demostrarlo apagando la red y usando la herramienta igualmente.
La herramienta
Arrastra una captura del código de exportación
O pega una, elige un archivo, o apunta la cámara al teléfono.
La descodificación ocurre en tu máquina, en esta pestaña, y por eso hace falta JavaScript para que ocurra siquiera. Aquí no hay ningún servidor que pudiera hacerlo en su lugar. Todo lo que viene debajo explica el formato y qué hace la herramienta con él, y el código está publicado si prefieres ejecutarlo tú.
Antes de empezar
Trata ese código de exportación como una contraseña.
No es un aviso de cara a la galería. Un código QR de exportación es un objeto más peligroso de lo que la mayoría de la gente supone, en tres aspectos concretos que conviene conocer antes de generar uno.
Contiene todas las claves, no una foto de tus códigos
El código contiene la clave secreta en bruto de cada cuenta que hay en él. Cualquiera que tenga la imagen puede generar códigos válidos para esas cuentas indefinidamente, desde cualquier dispositivo, sin tu teléfono y sin que te enteres.
Cambiar la contraseña no lo revoca
Ni una contraseña nueva, ni un teléfono nuevo, ni borrar la app invalidan una clave secreta exportada. Lo único que lo hace es desactivar y volver a activar la autenticación en dos factores en cada servicio, lo que emite una clave nueva y retira la antigua.
La captura sobrevive al momento
Una captura acaba en tu carrete y de ahí en la copia de seguridad de fotos que tengas. Quien la encuentre dentro de un año tendrá exactamente el acceso que tenías tú. Haz esto en un dispositivo de tu confianza y borra la imagen después, también del álbum de eliminados recientemente.
Lo que se obtiene
Todos los campos, y de dónde sale cada uno.
La razón para hacer esto bien es que puedas distinguir un dato descodificado de un valor por defecto razonable. Se muestran los dos, y están etiquetados de forma distinta.
La clave secreta
Base32 según RFC 4648, en mayúsculas y sin relleno, exactamente como la muestra una app de autenticación. Dieciséis caracteres para una clave de diez bytes, treinta y dos para una de veinte. Esto es la credencial completa. Todo lo demás son metadatos sobre ella.
Emisor y cuenta
El servicio y la cuenta a la que pertenece. Google a veces pone el emisor en su propio campo y a veces lo mete dentro de la etiqueta de la cuenta como «Emisor:cuenta», así que se leen los dos y se muestran los dos, por separado.
Algoritmo, dígitos y tipo
Casi siempre SHA-1, seis dígitos y basado en tiempo, porque es lo que los servicios despliegan en realidad. Cuando la exportación deja alguno sin definir, se usa el valor por defecto habitual y el campo se marca como valor por defecto y no como dato.
El enlace otpauth
Un URI otpauth:// estándar, reconstruido a partir de los campos anteriores en lugar de descodificado, así que es exactamente lo que espera otro autenticador. Cada uno lleva además un código QR, listo para escanearlo directamente en otra app.
El periodo, etiquetado con honestidad
Todas las cuentas indican treinta segundos, y eso no se descodifica de nada. El formato de exportación tiene campos para la clave secreta, el nombre, el emisor, el algoritmo, el número de dígitos, el tipo y el contador, y ningún campo para el periodo. Google Authenticator usa treinta segundos para todo lo que exporta, así que eso es lo que se indica, marcado como valor por defecto para que nunca se confunda con algo que estuviera en el código.
Cuentas basadas en contador
Unas pocas cuentas están basadas en contador y no en tiempo, así que su código no rota. El contador se muestra tal como se ha exportado. Trátalas con cuidado: usar un código avanza el contador en el servicio, y una copia que se ha quedado atrás deja de funcionar.
Cómo funciona
Son cinco descodificaciones, una detrás de otra.
Nada de esto es criptografía y nada de esto necesita un servidor. La cadena es lo bastante corta como para describirla entera, y vale la pena hacerlo, porque la explicación habitual es «instala estos tres programas».
La herramienta implementa las cinco por su cuenta, sin código de terceros. Leer el código QR es, con mucha diferencia, la parte más grande, porque el navegador no lo hará por ti: el detector de códigos de barras integrado no existe en Safari ni en Firefox, así que el descodificador está escrito a partir de la especificación.
01
Leer el código QR
La imagen se reduce a blanco y negro, se identifican los tres patrones de esquina, se ajusta una rejilla que pasa por ellos (en perspectiva, si la foto se tomó en ángulo), se muestrea cada módulo y la corrección de errores Reed-Solomon repara lo que la cámara haya captado mal. Sale una cadena que empieza por otpauth-migration://offline?data=.
02
Descodificar el parámetro data
Deshacer la codificación porcentual de ese parámetro da base64 estándar, que se descodifica en unas pocas docenas de bytes. Vale la pena nombrar una trampa: no hay que leerlo con un analizador de consultas de URL, porque esos aplican la descodificación de formularios y convierten el signo más en un espacio, y base64 estándar usa signos más.
03
Interpretar el protocol buffer
Esos bytes son un mensaje protobuf no documentado que contiene un registro de cuenta repetido, una versión, un tamaño de lote, un índice de lote y un identificador de lote. Cada registro de cuenta tiene siete campos: la clave secreta en bruto, el nombre, el emisor, y números que representan el algoritmo, el número de dígitos, el tipo y el contador.
04
Volver a codificar la clave secreta en base32
La clave secreta llega como bytes en bruto. Las apps de autenticación la muestran en base32, así que los bytes se vuelven a codificar para producir la cadena que escribirías a mano en otra app.
05
Generar un código para comprobarlo
Un código basado en tiempo es un HMAC del intervalo actual de treinta segundos con esa clave, truncado a seis dígitos. La criptografía del propio navegador hace el HMAC, así que aquí no hay criptografía casera en ninguna parte. Si el código coincide con el que muestra tu teléfono, la extracción es correcta, y esa es la única comprobación que importa de verdad.
Privacidad
La afirmación es concreta, y puedes comprobarla.
Una afirmación de privacidad que no puedes comprobar es marketing. Así que aquí está la exacta, y lo que puedes hacer en diez segundos para verificarla.
Tu imagen y tus claves secretas nunca se transmiten
La imagen que arrastras, el contenido descodificado, las claves secretas y los códigos generados se quedan en esta pestaña. El código que los maneja no contiene ni una sola llamada a fetch, XMLHttpRequest, WebSocket, EventSource ni sendBeacon, y la versión sin conexión añade una política de seguridad de contenido para que el navegador lo imponga en lugar de tener que fiarse del código.
La prueba que vale la pena hacer tú mismo
Apaga la red, recarga esta página desde la caché o abre la versión descargada de un solo archivo, y usa la herramienta igualmente. Funciona. Nada que necesitara un servidor podría funcionar.
Lo que carga esta propia página
Para ser exactos, porque la afirmación más amplia sería falsa: esta página carga un pequeño script de analítica alojado por nosotros que registra la dirección de la página y nada más. No se acerca a la herramienta y no puede ver lo que extraes. Si eso te sigue molestando, la versión sin conexión no tiene ninguna referencia externa de ningún tipo.
No se almacena nada
Sin cookies, sin almacenamiento local, sin almacenamiento de sesión, sin base de datos, sin caché. Recargar pierde todo lo que hubieras extraído, lo cual resulta incómodo una vez y es correcto siempre.
Qué hace borrar en realidad
Borrar sobrescribe con ceros los bytes de las claves secretas. Vale la pena hacerlo, y no es lo mismo que limpiar la memoria: las cadenas en JavaScript no se pueden sobrescribir, y el motor puede conservar copias a las que no llegamos ni nosotros ni tú. Cerrar la pestaña es lo que termina el trabajo, y ninguna página puede afirmar honestamente más que eso.
Publicado, y lo bastante pequeño para leerlo
Todo es un único paquete con licencia MIT y sin dependencias en tiempo de ejecución, así que no hay detrás ninguna cadena de suministro que auditar. El descodificador de QR, el lector de protobuf, los códecs de base32 y base64 y las funciones de contraseñas de un solo uso están todos dentro, y sus pruebas están fijadas a vectores de prueba publicados y no a sí mismas.
Conseguir el código
Dónde se esconde el código de exportación.
No se llama clave de exportación ni copia de seguridad, y no está en los ajustes. Google lo archiva bajo el cambio a un teléfono nuevo, y por eso la mayoría de la gente no lo encuentra nunca.
- 01Abre Google Authenticator en el teléfono que tiene las cuentas.
- 02Abre el menú y elige Transferir cuentas.
- 03Elige Exportar cuentas y autentícate cuando te lo pida.
- 04Marca las cuentas que quieras y continúa. Aparece un código QR.
- 05Haz una captura de ese código, o apunta al teléfono con la cámara de esta herramienta.
Si obtienes más de un código
Google reparte una lista larga entre varios códigos QR y te dice en cuál estás. Captúralos todos y añádelos uno detrás de otro. Comparten un identificador y cada uno lleva su propio índice, así que se combinan en cualquier orden y la herramienta indica qué partes faltan todavía. Los códigos de dos exportaciones distintas se rechazan en lugar de combinarse, porque cuentas solapadas de exportaciones separadas darían una lista que nunca existió en tu teléfono.
Captura de pantalla, no fotografía
Una captura de pantalla se descodifica a la primera. Una fotografía de una pantalla añade reflejos, muaré y perspectiva, cosas que el descodificador sabe manejar y que no necesita. Si estás fotografiando el teléfono de otra persona, llena el encuadre con el código y mantenlo de frente.
Después
Qué hacer con una clave secreta cuando ya la tienes.
Llévala a otra app
Aquí cada cuenta tiene su propio código QR, en el formato que lee cualquier autenticador, así que puedes escanearlo directamente en otra app. Escribir la clave en base32 a mano también funciona, y vale la pena si quieres asegurarte de que no se ha escaneado nada mal.
Comprueba un código contra el teléfono
Antes de fiarte de nada de esto, compara un código generado con el que muestra Google Authenticator para la misma cuenta en el mismo momento. Si coinciden, la clave es correcta. Si no, la clave es incorrecta y nada más del resultado importa.
Guárdala como una contraseña
Una clave secreta va en un gestor de contraseñas, en la entrada de esa cuenta, no en una nota ni en una hoja de cálculo. Algunos gestores generan los códigos por ti si pegas el enlace otpauth. Conviene pensarlo antes: un gestor que guarda a la vez la contraseña y el segundo factor es un único punto de fallo, y eso puede convenirte o no.
Borra la captura
También del álbum de eliminados recientemente, y antes de que tu biblioteca de fotos la sincronice a algún sitio. Después borra todo en la herramienta y cierra la pestaña.
Detalle
Los datos concretos.
Lo que la herramienta hace y lo que no, sin marketing. Cada fila de aquí la comprueban las propias pruebas del paquete.
- Ejecución
- Enteramente en tu navegador. Sin servidor, sin cuenta, sin nada que instalar.
- Lectura
- Códigos de exportación de Google Authenticator (otpauth-migration) y códigos otpauth de una sola cuenta
- Entrada
- Arrastrar y soltar, pegar, un selector de archivos o la cámara del dispositivo
- Salida
- Clave secreta en base32, emisor, nombre de la cuenta, algoritmo, dígitos, tipo, contador, enlace otpauth, un código QR de importación y un código generado al momento
- Red
- Ninguna. Ni fetch, ni XMLHttpRequest, ni WebSocket, ni EventSource, ni sendBeacon en ninguna parte de la herramienta.
- Almacenamiento
- Ninguno. Sin cookies, ni almacenamiento local, ni almacenamiento de sesión, ni base de datos, ni caché.
- Sin conexión
- Sí. Una versión de un solo archivo funciona desde tu propio disco con la red apagada.
- Navegadores
- Chrome, Edge, Firefox y Safari 16 o posterior. La cámara necesita una página segura, así que puede que no se abra desde un archivo local.
- Dependencias
- Ninguna en tiempo de ejecución. El códec de QR, el lector de protobuf, los códecs de base32 y base64 y las funciones de contraseñas de un solo uso están todos en el paquete.
- Licencia
- MIT
Preguntas que vale la pena hacer.
- ¿Es seguro poner mi código de exportación en un sitio web?
- La respuesta honesta es que no deberías poner una credencial en una página que no puedes verificar, y por eso esta es verificable. Nada se transmite, el código está publicado y hay una versión de un solo archivo que puedes descargar y ejecutar con la red apagada. Si prefieres no fiarte de ninguna página, usa esa.
- ¿Se envía algo a vuestros servidores?
- No, y no hay nada en nuestro lado que pudiera recibirlo. La descodificación, el análisis y la generación de códigos ocurren en tu navegador. Abre el panel de red de tu navegador, extrae un código y no verás ni una petición.
- ¿Puedo usarla sin conexión a internet?
- Sí. Descarga el archivo HTML único de la página de versiones del repositorio y ábrelo. No tiene ninguna referencia externa de ningún tipo y lleva una política de seguridad de contenido que prohíbe las conexiones por completo. Todo funciona menos la cámara, que algunos navegadores no conceden a una página abierta desde un archivo; arrastrar o pegar una captura funciona siempre.
- Si alguien consigue mi código de exportación, ¿cómo lo revoco?
- No puedes revocar una clave secreta por sí sola. Desactiva la autenticación en dos factores en el servicio afectado y vuelve a configurarla, lo que emite una clave nueva y deja la antigua inservible. Cambiar la contraseña no hace esto, y tampoco borrar la app ni restablecer el teléfono.
- Google me ha dado varios códigos QR. ¿Y ahora qué?
- Captúralos todos y añádelos de uno en uno. Comparten un identificador de lote y cada uno lleva su propio índice, así que se combinan en cualquier orden y la herramienta te dice qué partes faltan todavía. Volver a añadir uno que ya tienes no causa ningún problema. Los códigos de dos exportaciones distintas se rechazan en lugar de combinarse, porque la lista resultante sería una que nunca existió en tu teléfono.
- ¿Por qué todas las cuentas dicen treinta segundos?
- Porque el formato de exportación no tiene campo de periodo, y Google Authenticator usa treinta segundos para todo. El valor es correcto y no se descodifica de nada, y por eso está etiquetado como valor por defecto en lugar de mostrarse como un dato. Si un servicio usara un intervalo distinto, una exportación de esta app no te lo diría.
- Una de mis cuentas no tiene código rotatorio.
- Esa cuenta está basada en contador y su código no rota a propósito. Su contador se muestra tal como se ha exportado. Ten cuidado con ella: usar un código avanza el contador en el servicio, así que una copia que se haya quedado atrás dejará de ser aceptada.
- ¿Qué algoritmos admite?
- SHA-1, SHA-256 y SHA-512, usando la criptografía del propio navegador. MD5 aparece en la lista de algoritmos del formato, pero los navegadores no pueden calcularlo, así que en ese caso no se genera ningún código; la clave secreta y todos los demás parámetros se devuelven igualmente correctos. En la práctica los servicios usan SHA-1 con seis dígitos, y Google Authenticator ignora cualquier otra cosa de todos modos.
- La cámara no funciona.
- Necesita una página segura, así que no se abrirá por http sin cifrar y puede que no se abra desde una dirección de archivo. El navegador suele recordar una denegación, así que revisa los ajustes del sitio. Haga lo que haga la cámara, arrastrar o pegar una captura funciona en todas partes.
- No abre mi foto del iPhone.
- Las fotos del iPhone son HEIC, y ningún navegador salvo Safari descodifica una. Haz una captura de pantalla en lugar de una foto, o convierte el archivo a PNG o JPEG. Una captura es la mejor entrada en cualquier caso, porque no tiene reflejos ni perspectiva.
- ¿Puedo llevar estas cuentas a otro autenticador?
- Sí. Cada cuenta tiene su propio código QR en el formato otpauth estándar, que lee cualquier app de autenticación, y también puedes escribir la clave en base32 a mano. Compara un código generado con tu teléfono antes de borrar nada de él.
- He visto hacer esto con zbarimg y un programa en Go.
- Son las mismas tres descodificaciones con tres instalaciones por delante: leer el código QR, descodificar en base64 el parámetro data, interpretar el protobuf. Esto lo hace todo en una página, y el paquete que hay detrás está publicado si prefieres programarlo tú. Aquí no se envuelve ninguna de esas herramientas; el descodificador de QR y el lector de protobuf están escritos a partir de sus especificaciones.
Tuya para quedártela, y tuya para comprobarla.
Un único paquete con licencia MIT y sin dependencias en tiempo de ejecución. Léelo, haz un fork, ejecútalo sin conexión, o simplemente úsalo aquí.
Leer el código fuente