Generador TOTP - Herramienta de Contraseña de Un Solo Uso en Línea
Genera y verifica códigos TOTP para pruebas 2FA. Crea secretos, códigos QR y URIs otpauth://. Compatible con RFC 6238 — 100% del lado del cliente.
Ingrese una clave secreta para generar códigos TOTP
Preguntas Frecuentes
Que es un generador TOTP?
Un generador TOTP (Contrasena de un solo uso basada en tiempo) es una herramienta en linea que crea codigos de autenticacion con limite de tiempo siguiendo el estandar RFC 6238. TOTP es el algoritmo detras de aplicaciones de autenticacion populares como Google Authenticator, Authy y Microsoft Authenticator. Funciona combinando una clave secreta compartida con la marca de tiempo Unix actual usando una funcion HMAC (Codigo de Autenticacion de Mensajes basado en Hash), y luego truncando el resultado para producir un codigo numerico corto (tipicamente de 6 u 8 digitos). El codigo cambia cada 30 segundos (por defecto), lo que lo hace util como segundo factor en la autenticacion de dos factores (2FA). Esta herramienta permite a los desarrolladores generar, verificar y probar codigos TOTP directamente en el navegador sin instalar una aplicacion de autenticacion.
Como uso esta herramienta?
1. Ingrese una clave secreta codificada en Base32, o haga clic en "Generar Secreto" para crear una aleatoria. 2. Configure los parametros TOTP: algoritmo (SHA-1 es el predeterminado usado por la mayoria de servicios), cantidad de digitos (6 u 8) y periodo de tiempo (30 segundos es el estandar). 3. La herramienta muestra inmediatamente el codigo TOTP actual con un temporizador de cuenta regresiva que indica cuando se actualizara. 4. Opcionalmente, complete los campos Emisor y Etiqueta para generar un URI otpauth:// completo. 5. Escanee el codigo QR generado con su aplicacion de autenticacion para verificar que los codigos coincidan. 6. Use la pestana Verificar para pegar un codigo y comprobar si es valido para el secreto y la ventana de tiempo configurados. 7. Haga clic en el boton de copiar junto a cualquier codigo o URI para copiarlo al portapapeles.
Esta segura mi clave secreta? Se envia a un servidor?
Su clave secreta esta 100% segura y nunca sale de su navegador. Todo el calculo TOTP -- calculo HMAC, generacion de codigos, verificacion y renderizado de codigos QR -- se realiza completamente en el lado del cliente usando JavaScript. La herramienta utiliza la biblioteca otpauth para el calculo RFC 6238 y la API Web Crypto nativa del navegador para operaciones criptograficas. Ningun dato se transmite a ningun servidor, ningun analitico rastrea el contenido de su clave secreta y ningun dato se almacena en ningun lugar mas alla de la memoria de la pestana de su navegador. Esto hace que la herramienta sea segura para pruebas con secretos TOTP reales durante el desarrollo y QA.
Que es el formato de URI otpauth://?
El URI otpauth:// es un formato estandarizado para aprovisionar secretos TOTP (y HOTP) en aplicaciones de autenticacion. Cuando se codifica en un codigo QR, escanearlo configura automaticamente la aplicacion de autenticacion con todos los parametros necesarios. El formato es: otpauth://totp/{etiqueta}?secret={secreto}&issuer={emisor}&algorithm={algoritmo}&digits={digitos}&period={periodo}. La etiqueta tipicamente tiene el formato emisor:cuenta (por ejemplo, MiApp:usuario@ejemplo.com), el secreto es la clave compartida codificada en Base32, y los parametros opcionales incluyen algoritmo (SHA1, SHA256, SHA512), digitos (6 u 8) y periodo (por defecto 30 segundos). Este formato es compatible con Google Authenticator, Microsoft Authenticator, Authy, FreeOTP y practicamente todas las aplicaciones de autenticacion que cumplen con los estandares.
Cual es la diferencia entre TOTP y HOTP?
TOTP (Contrasena de un solo uso basada en tiempo, RFC 6238) genera codigos basados en el tiempo actual. El codigo cambia automaticamente cada N segundos (30 por defecto), y tanto el servidor como el cliente usan la marca de tiempo Unix actual como contador, por lo que permanecen sincronizados mientras sus relojes sean razonablemente precisos. HOTP (Contrasena de un solo uso basada en HMAC, RFC 4226) genera codigos basados en un contador incremental. Cada vez que se genera un codigo, el contador avanza en uno, y el servidor y el cliente deben rastrear el contador de forma independiente; puede ocurrir desincronizacion si se generan codigos pero no se usan. TOTP es tecnicamente una extension de HOTP donde el "contador" se deriva del tiempo actual dividido por el periodo. Esta herramienta se enfoca en TOTP ya que es el estandar dominante para implementaciones modernas de 2FA.
Por que mis codigos TOTP son diferentes a los de mi aplicacion de autenticacion?
Si los codigos generados por esta herramienta no coinciden con su aplicacion de autenticacion, verifique estas causas comunes: (1) Clave secreta incorrecta -- asegurese de que el secreto Base32 se ingrese exactamente, ya que incluso un caracter incorrecto producira codigos completamente diferentes. (2) Desajuste de algoritmo -- la mayoria de servicios usan SHA-1 (el predeterminado), asi que asegurese de que tanto la herramienta como su aplicacion esten configuradas de forma identica si su servicio usa SHA-256 o SHA-512. (3) Desajuste en cantidad de digitos -- la mayoria de servicios usan 6 digitos, pero algunas herramientas empresariales usan 8. (4) Desajuste de periodo -- el periodo estandar es 30 segundos, pero algunos servicios usan 60 o 90 segundos. (5) Desviacion del reloj -- TOTP es sensible al tiempo, por lo que si el reloj de su dispositivo esta significativamente desfasado (mas de 30 segundos), los codigos no coincidiran. Asegurese de que su reloj del sistema este sincronizado via NTP.
Que tan seguro es TOTP para la autenticacion de dos factores?
TOTP proporciona un fuerte segundo factor de autenticacion cuando se implementa correctamente. Cada codigo es valido solo durante un periodo de tiempo (tipicamente 30 segundos), limitando la ventana para ataques de intercepcion. Utiliza funciones hash criptograficas (SHA-1, SHA-256 o SHA-512) para derivar codigos de la clave secreta mediante HMAC, lo que hace computacionalmente inviable la ingenieria inversa del secreto a partir de codigos observados. El secreto compartido se establece una vez durante la inscripcion y no se transmite nuevamente durante la autenticacion normal. Sin embargo, TOTP no es inmune a todos los ataques: los ataques de phishing pueden capturar y reproducir codigos en tiempo real, y el secreto compartido puede verse comprometido si se viola el almacenamiento de secretos del servidor. Para la maxima seguridad, combine TOTP con metodos resistentes al phishing como WebAuthn/FIDO2.
Ejemplos de Codigo
// TOTP Generator using Web Crypto API (RFC 6238)
function base32Decode(base32) {
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
const cleaned = base32.toUpperCase().replace(/[^A-Z2-7]/g, '');
let bits = '';
for (const char of cleaned) {
const val = alphabet.indexOf(char);
if (val === -1) throw new Error(`Invalid Base32 character: ${char}`);
bits += val.toString(2).padStart(5, '0');
}
const bytes = new Uint8Array(Math.floor(bits.length / 8));
for (let i = 0; i < bytes.length; i++) {
bytes[i] = parseInt(bits.substr(i * 8, 8), 2);
}
return bytes;
}
async function generateTOTP(secret, options = {}) {
const {
algorithm = 'SHA-1',
digits = 6,
period = 30,
timestamp = Date.now(),
} = options;
const counter = Math.floor(timestamp / 1000 / period);
const counterBuffer = new ArrayBuffer(8);
const counterView = new DataView(counterBuffer);
counterView.setUint32(4, counter, false);
const keyBytes = base32Decode(secret);
const cryptoKey = await crypto.subtle.importKey(
'raw', keyBytes,
{ name: 'HMAC', hash: algorithm },
false, ['sign']
);
const hmacBuffer = await crypto.subtle.sign('HMAC', cryptoKey, counterBuffer);
const hmac = new Uint8Array(hmacBuffer);
const offset = hmac[hmac.length - 1] & 0x0f;
const code =
((hmac[offset] & 0x7f) << 24) |
((hmac[offset + 1] & 0xff) << 16) |
((hmac[offset + 2] & 0xff) << 8) |
(hmac[offset + 3] & 0xff);
const otp = code % Math.pow(10, digits);
return otp.toString().padStart(digits, '0');
}
function generateSecret(bits = 160) {
const bytes = new Uint8Array(bits / 8);
crypto.getRandomValues(bytes);
const alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';
let result = '', buffer = 0, bufferLength = 0;
for (const byte of bytes) {
buffer = (buffer << 8) | byte;
bufferLength += 8;
while (bufferLength >= 5) {
bufferLength -= 5;
result += alphabet[(buffer >> bufferLength) & 0x1f];
}
}
if (bufferLength > 0) {
result += alphabet[(buffer << (5 - bufferLength)) & 0x1f];
}
return result;
}
// Usage:
// const secret = generateSecret();
// const code = await generateTOTP(secret);
// console.log('TOTP:', code);