Guia Completa de 2FA - Comparacion e Implementacion de TOTP, SMS y Llaves de Hardware
Tipos y niveles de seguridad de la autenticacion de dos factores (2FA). Ventajas y desventajas de aplicaciones TOTP, SMS y llaves de hardware con guia de implementacion para desarrolladores.
Toolypet Team
Development Team
Guia Completa de 2FA: Que, Por Que y Como
Una vez que tu contrasena se filtra, se acabo.
Hasta 2024, se han filtrado mas de 10 mil millones de contrasenas. No importa cuan fuerte sea tu contrasena, es impotente ante las brechas de bases de datos.
2FA (Autenticacion de Dos Factores) protege tu cuenta incluso si tu contrasena esta comprometida.
Que es 2FA?
2FA (Two-Factor Authentication) es la autenticacion usando dos factores.
Los Tres Factores de Autenticacion
| Factor | Significado | Ejemplos |
|---|---|---|
| Conocimiento | Algo que sabes | Contrasena, PIN |
| Posesion | Algo que tienes | Telefono, llave de hardware |
| Inherencia | Algo que eres | Huella digital, rostro |
2FA combina dos de estos factores.
Contrasena (conocimiento) + App TOTP (posesion) = 2FA
PIN (conocimiento) + Huella digital (inherencia) = 2FA
Por Que es Necesario
| Tipo de Ataque | Solo Contrasena | Con 2FA |
|---|---|---|
| Phishing | Violado | Retrasado o bloqueado |
| Fuerza bruta | Potencialmente violado | Bloqueado |
| Filtracion de BD | Violado | Bloqueado |
| Shoulder surfing | Violado | Bloqueado |
Comparando Tipos de 2FA
1. Autenticacion por SMS
Intento de inicio de sesion → Recibir codigo de 6 digitos en telefono → Ingresar codigo
| Ventajas | Desventajas |
|---|---|
| No requiere app adicional | Vulnerable a SIM swapping |
| Usuarios familiarizados | Vulnerable a phishing |
| Rapido de implementar | Requiere conexion celular |
Calificacion de Seguridad: 2/5 (Bajo)
SMS es vulnerable a ataques de SIM swapping. Si los atacantes enganan al operador para clonar tu SIM, pueden interceptar mensajes SMS.
2. Apps TOTP (Recomendado)
Contrasena de Un Solo Uso Basada en Tiempo
Nuevo codigo generado cada 30 segundos
Ejemplos de apps: Google Authenticator, Authy, 1Password
| Ventajas | Desventajas |
|---|---|
| Funciona sin conexion | Requiere instalar app |
| Inmune a SIM swapping | Riesgo de perder claves de recuperacion |
| Gratis | Problemas si pierdes el dispositivo |
Calificacion de Seguridad: 4/5 (Alto)
3. Llaves de Seguridad de Hardware
Autenticacion fisica via USB o NFC
Ejemplos: YubiKey, Google Titan Key
| Ventajas | Desventajas |
|---|---|
| Proteccion completa contra phishing | Costo ($30-70) |
| Seguridad mas fuerte | Riesgo de perdida fisica |
| Facil de usar | No soportado por todos los servicios |
Calificacion de Seguridad: 5/5 (Maximo)
4. Autenticacion por Push en App
Intento de inicio de sesion → Notificacion push a la app → Aprobar/Rechazar
Ejemplos: Microsoft Authenticator, Duo
| Ventajas | Desventajas |
|---|---|
| Conveniente | Requiere internet |
| Resistente a phishing | Dependiente de la app |
Calificacion de Seguridad: 4/5 (Alto)
Como Funciona TOTP
Concepto
TOTP = HMAC-SHA1(clave secreta, tiempo) → numero de 6 digitos
- Servidor y app comparten una clave secreta
- El tiempo actual se divide en intervalos de 30 segundos
- Se genera hash a partir de clave secreta + tiempo
- Se extrae numero de 6 digitos del hash
Como servidor y app usan el mismo tiempo y la misma clave, generan el mismo codigo.
Que Contiene el Codigo QR
otpauth://totp/Servicio:Cuenta?secret=SECRETOBASE32&issuer=Servicio
otpauth://totp/GitHub:user@example.com?secret=JBSWY3DPEHPK3PXP&issuer=GitHub
Al escanear el codigo QR, la app guarda esta informacion.
Implementacion de TOTP para Desarrolladores
Ejemplo Node.js (otplib)
const { authenticator } = require('otplib');
// 1. Generar secreto (durante registro de usuario)
const secret = authenticator.generateSecret();
// "JBSWY3DPEHPK3PXP"
// 2. Generar URL del codigo QR
const otpauthUrl = authenticator.keyuri(
'user@example.com',
'MyApp',
secret
);
// Generar imagen con libreria QR
// 3. Verificar codigo (durante inicio de sesion)
const userToken = "123456"; // Entrada del usuario
const isValid = authenticator.verify({ token: userToken, secret });
if (isValid) {
console.log("Autenticacion exitosa");
} else {
console.log("Codigo invalido");
}
Ejemplo Python (pyotp)
import pyotp
# 1. Generar secreto
secret = pyotp.random_base32()
# 2. URL del codigo QR
totp = pyotp.TOTP(secret)
url = totp.provisioning_uri(name='user@example.com', issuer_name='MyApp')
# 3. Verificar codigo
user_token = "123456"
is_valid = totp.verify(user_token)
Consideraciones de Seguridad
// Permitir desviacion de tiempo (30 segundos antes y despues)
authenticator.options = {
window: 1 // Permitir de -30seg a +30seg
};
// Prevenir reutilizacion
// Almacenar codigos usados y bloquear reutilizacion
const usedCodes = new Set();
function verifyOnce(token, secret) {
if (usedCodes.has(token)) return false;
if (authenticator.verify({ token, secret })) {
usedCodes.add(token);
// Eliminar despues de 60 segundos (gestion de memoria)
setTimeout(() => usedCodes.delete(token), 60000);
return true;
}
return false;
}
Gestion de Codigos de Recuperacion
Si pierdes 2FA, no puedes acceder a tu cuenta. Siempre proporciona codigos de recuperacion.
Generacion
const crypto = require('crypto');
function generateRecoveryCodes(count = 10) {
const codes = [];
for (let i = 0; i < count; i++) {
// 8 caracteres mayusculas + numeros
const code = crypto.randomBytes(4).toString('hex').toUpperCase();
codes.push(`${code.slice(0,4)}-${code.slice(4)}`);
}
return codes;
}
// ["A3F8-B2C1", "D4E5-F6G7", ...]
Almacenamiento
// Hashear codigos de recuperacion antes de almacenar (bcrypt recomendado)
const bcrypt = require('bcrypt');
async function storeRecoveryCodes(codes) {
const hashedCodes = await Promise.all(
codes.map(code => bcrypt.hash(code, 10))
);
// Almacenar hashedCodes en BD
}
// Verificar cuando se usa
async function useRecoveryCode(inputCode, hashedCodes) {
for (const hashed of hashedCodes) {
if (await bcrypt.compare(inputCode, hashed)) {
// Eliminar codigo (uso unico)
return true;
}
}
return false;
}
Consejos de Experiencia de Usuario (UX)
1. Fomentar la Configuracion de 2FA
Despues del primer inicio de sesion: "Configura 2FA para asegurar tu cuenta"
Antes de acciones sensibles: "Se requiere 2FA para esta accion"
2. Guia Paso a Paso
Paso 1: Instalar app de autenticacion (proporcionar enlace a Google Authenticator)
Paso 2: Escanear codigo QR
Paso 3: Confirmar con codigo de 6 digitos
Paso 4: Guardar codigos de recuperacion (enfatizar!)
3. Enfatizar Codigos de Recuperacion
Advertencia: Guarda estos codigos en un lugar seguro.
La recuperacion de cuenta sera imposible si se pierden.
[ Descargar Codigos ] [ Copiar Codigos ]
Preguntas Frecuentes
P: Debo evitar completamente el 2FA por SMS?
R: Es mas debil que TOTP, pero mucho mejor que nada. Usa TOTP o llaves de hardware cuando sea posible, pero si un servicio solo soporta SMS, definitivamente activalo.
P: Que pasa si pierdo mi telefono con la app 2FA?
R: Inicia sesion con un codigo de recuperacion y restablece 2FA. Por eso debes guardar los codigos de recuperacion de forma separada y segura.
P: Puedo registrar 2FA de respaldo?
R: Si, registra multiples dispositivos en la misma cuenta (si el servicio lo soporta), o escanea el codigo QR en multiples dispositivos simultaneamente durante la configuracion inicial.
Resumen
| Tipo de 2FA | Seguridad | Conveniencia | Recomendacion |
|---|---|---|---|
| SMS | 2/5 | 5/5 | Ultimo recurso |
| App TOTP | 4/5 | 4/5 | Generalmente recomendado |
| Llave de Hardware | 5/5 | 3/5 | Alta seguridad |
| Push en App | 4/5 | 5/5 | Uso empresarial |
Usa al menos TOTP. Las contrasenas solas no son suficientes.
Herramientas Relacionadas
| Herramienta | Proposito |
|---|---|
| Generador TOTP | Probar codigos 2FA |
| Generador de Contrasenas | Contrasenas fuertes |
| Generador de Hash | Pruebas de hashing |
Sobre el Autor
Toolypet Team
Development Team
The Toolypet Team creates free, privacy-focused web tools for developers and designers. All tools run entirely in your browser with no data sent to servers.