Generador de códigos de respaldo 2FA con semilla
Este generador de códigos de respaldo para autenticación de dos factores crea la cantidad exacta de códigos de recuperación únicos y de un solo uso en el formato habitual de cuatro dígitos, guion y cuatro dígitos.
Ejecutar — gratis
Indique una cantidad y una semilla secreta, y las mismas entradas siempre producirán el mismo conjunto ordenado. Esta repetibilidad resulta útil para aprovisionamiento controlado, datos de prueba, procedimientos documentados de recuperación y sistemas que deben reconstruir códigos sin guardar la lista generada. El cálculo es exclusivamente local: no utiliza la red, el reloj, una fuente aleatoria, datos de cuentas ni estado oculto. Proteja la semilla y cada código resultante como material de autenticación confidencial.
Elija la cantidad y proteja la semilla
Comience por decidir cuántos códigos de recuperación debe emitir la cuenta o aplicación. La cantidad debe ser un entero entre uno y mil; una solicitud inferior a uno se rechaza en lugar de producir silenciosamente un conjunto vacío. Después, indique una semilla que no esté vacía. La semilla es la fuente completa de reproducibilidad, por lo que valores idénticos de semilla y cantidad generan códigos idénticos en el mismo orden. Utilice un secreto largo y de alta entropía, creado y almacenado mediante el procedimiento de gestión de secretos aprobado por su organización. El nombre de una persona, una dirección de correo, la etiqueta de un proyecto o una frase breve y fácil de recordar no son semillas adecuadas para producción, porque otra persona podría adivinarlos y reconstruir los códigos. No reutilice una semilla entre usuarios, entornos o servicios. La separación de dominios del algoritmo evita coincidencias accidentales con otras derivaciones, pero no corrige una semilla débil o expuesta. Para pruebas automatizadas reproducibles, identifique y aísle claramente las semillas de prueba, de modo que sus resultados nunca sean válidos en un sistema de autenticación de producción. La semilla admite como máximo 4,096 caracteres para que la ejecución permanezca acotada y previsible.
Comprenda el proceso de generación determinista
Cada posición de salida se deriva por separado con SHA-256 a partir de una etiqueta con versión, la longitud exacta de la semilla, el texto de la semilla, la posición desde cero y un contador de reintentos. Incluir la longitud hace inequívoca la delimitación de la entrada, mientras que la etiqueta con versión separa este uso de otros cálculos basados en semillas. El generador lee valores sin signo del resumen y aplica muestreo por rechazo antes de reducirlos a ocho dígitos decimales. Ese paso evita el pequeño sesgo de distribución que introduciría una conversión directa mediante módulo. Cada número aceptado se presenta en dos grupos de cuatro dígitos separados por un guion y conserva los ceros iniciales. Un conjunto registra los valores ya emitidos; si se produce una colisión, el contador avanza de forma determinista hasta encontrar un código nuevo. Por eso, el resultado contiene la cantidad solicitada de códigos únicos, y una nueva ejecución reproduce tanto las decisiones ante colisiones como la lista final. Ningún servicio de red, reloj del sistema, generador aleatorio del entorno, caché persistente ni estado mutable del módulo puede alterar la respuesta. Cambiar un solo carácter de la semilla normalmente transforma toda la lista.
Implemente, almacene e invalide los códigos de forma segura
La generación es solo una parte de un procedimiento de códigos de respaldo. Su servicio de autenticación debe guardar un verificador aprobado para cada código, marcarlo como consumido tras el primer uso correcto, limitar la frecuencia de intentos y ofrecer una acción deliberada de revocación o regeneración. Nunca registre la semilla ni los códigos sin cifrar en analítica, trazas, solicitudes de soporte, salidas de compilación o conversaciones compartidas. Entregue los códigos al usuario autenticado mediante una sesión protegida y recomiende almacenarlos sin conexión en un gestor de contraseñas u otro lugar seguro. El determinismo facilita la recuperación ante desastres y el aprovisionamiento controlado, pero también permite que cualquiera que obtenga la semilla reconstruya todos los códigos. Rote a una semilla nueva e independiente ante cualquier sospecha de exposición, cuando el usuario pida regenerarlos o cuando la política exija invalidar el conjunto anterior. No se limite a solicitar otra cantidad con la semilla antigua: las posiciones comunes de ambas solicitudes seguirán siendo iguales. Los dígitos agrupados facilitan la transcripción, pero cada código solo dispone de cien millones de valores posibles; por ello, las defensas en línea continúan siendo esenciales. La API cuesta $0.002 por solicitud y la opción del navegador emplea el mismo cálculo puro.
Qué puede hacer con ella
Aprovisionar códigos de recuperación
Cree un conjunto controlado de códigos de recuperación agrupados durante el alta y conserve la reproducibilidad mediante una semilla protegida para cada usuario.
Crear pruebas de autenticación estables
Genere datos fijos de códigos de respaldo para pruebas de integración sin guardar en el repositorio una lista mantenida manualmente.
Reconstruir un conjunto autorizado
Recupere la misma lista ordenada durante un procedimiento documentado de incidentes cuando la semilla protegida siga disponible, pero no la copia mostrada.
Preguntas frecuentes
¿Qué formato utilizan los códigos?
Cada código contiene ocho dígitos decimales en dos grupos de cuatro, por ejemplo 0123-4567. Se conservan los ceros iniciales.
¿Las mismas entradas siempre devuelven los mismos códigos?
Sí. El algoritmo no depende del azar, el reloj, la red ni un estado almacenado, por lo que la misma cantidad y la semilla exacta reproducen la misma lista ordenada.
¿Puede haber códigos duplicados en una respuesta?
No. Las colisiones se detectan y se reintentan de manera determinista hasta que la lista solicitada contiene códigos únicos.
¿Puedo usar una semilla fácil de recordar?
No en producción. Utilice un secreto largo y de alta entropía generado y guardado mediante un proceso aprobado, porque quien obtenga o adivine la semilla podrá reconstruir los códigos.
¿Qué ocurre si la cantidad es cero o negativa?
La solicitud falla con un error de entrada no válida que indica que la cantidad debe ser como mínimo uno.
¿Cuánto cuesta una solicitud a la API?
Cada solicitud a la API cuesta $0.002. La versión para navegador ejecuta localmente el mismo algoritmo puro.
Para desarrolladores — acceso por API
Todo lo de esta página está disponible por programación. Esta sección es para equipos que quieren integrarlo en sus sistemas; el resto puede usar la herramienta de arriba sin más.
Endpoint de API
¿Prefiere automatizarlo? Un POST autenticado crea la tarea; el resultado llega por webhook o enlace firmado. La misma capacidad también se ejecuta aquí en la web, por email y desde Telegram — y pronto también desde nuestra app.
Llámela desde su stack
curl -X POST https://api.kit.forhosting.com/security/two-factor-backup-codes-generate \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"count":8,"seed":"correct-horse-battery-staple-2026"}'const res = await fetch("https://api.kit.forhosting.com/security/two-factor-backup-codes-generate", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"count": 8,
"seed": "correct-horse-battery-staple-2026"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/security/two-factor-backup-codes-generate",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"count": 8,
"seed": "correct-horse-battery-staple-2026"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/security/two-factor-backup-codes-generate", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"count":8,"seed":"correct-horse-battery-staple-2026"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"count":8,"seed":"correct-horse-battery-staple-2026"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/security/two-factor-backup-codes-generate", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Ejemplo de solicitud
{
"count": 8,
"seed": "correct-horse-battery-staple-2026"
}Ejemplo de respuesta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "security.two_factor_backup_codes_generate",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}La API es asíncrona: la llamada devuelve un task_id al instante y el resultado llega por webhook. El polling está limitado a 1 req/s por tarea.
Precio
Precio publicado — sin tokens ni créditos inventados. Una tarea fallida no se cobra.
Errores
| HTTP | Código | Significado |
|---|---|---|
401 | unauthorized | API key ausente o inválida. |
402 | insufficient_balance | El saldo no cubre el precio de la tarea. |
404 | unknown_type | El tipo de tarea no existe. |
429 | rate_limited | Demasiadas peticiones. Use el webhook en vez de sondear. |