Antiabuso y seguridad de códigos

En vista previa

El código es un secreto. Lo tratamos como tal.

Configurar en:
Cursor

Un código de un solo uso es tan bueno como la forma en que se genera, almacena y limita en frecuencia. Bird Verify genera códigos con una fuente criptográfica, almacena solo un hash, compara en tiempo constante y limita tanto los envíos como los intentos de adivinación, de modo que un registro filtrado o un ataque de fuerza bruta no le sirven de nada al atacante. La puntuación de fraude se construye sobre esta base a continuación.

verify.ts
200 · pending
import { BirdClient } from "@messagebird/sdk";

const bird = new BirdClient({ apiKey: process.env.BIRD_API_KEY! });

// Send the code, then check it by recipient.
await bird.verify.verifications.create({
  to: { phone_number: "+15551234567" },
}).safe();

const { data } = await bird.verify.verifications.check({
  to:   { phone_number: "+15551234567" },
  code: userInput,
}).safe();

Seguridad activa por defecto, no un complemento.

Cada verificación en la API de Bird Verify cuenta con las mismas protecciones: el código se genera en el servidor, nunca se devuelve y se almacena solo como hash; las comprobaciones se ejecutan en tiempo constante y contra un presupuesto limitado de intentos; y los envíos se limitan por destinatario y por workspace. No hace falta activar ni configurar nada de esto: así es como funciona la API, ya sea que la utilice como inicio de sesión con dos factores o como acceso sin contraseña.

Cinco protecciones en cada verificación.

Sin pasos de configuración, sin complementos adicionales.

  1. 01

    Generación criptográfica.

    Los códigos se obtienen de una fuente aleatoria criptográfica, distribuidos uniformemente en el espacio de códigos, no de un contador o marca de tiempo predecible.

  2. 02

    Hash en reposo, nunca en texto plano de salida.

    Solo se almacena un HMAC-SHA256 de cada código; el texto plano nunca es devuelto por la API ni se escribe en su stack o en nuestros registros.

  3. 03

    Comparación en tiempo constante.

    Los códigos enviados se comparan en tiempo constante, por lo que un atacante no obtiene información del tiempo que tarda una verificación.

  4. 04

    Bloqueo por intentos.

    Cada sesión tiene un número limitado de comprobaciones (5 por defecto). Una vez agotadas, la sesión falla, por lo que los intentos de adivinación no pueden continuar indefinidamente.

  5. 05

    Límites de envío.

    Un límite de envío por destinatario y un tiempo de espera para reenvíos acotan el gasto y la superficie de abuso, cada uno con un 429 con Retry-After.

Los intentos se agotan antes que la paciencia de sus usuarios.

Un código incorrecto devuelve un resultado con los intentos restantes, y la sesión falla cuando se agota el presupuesto, por lo que un bucle de fuerza bruta choca contra un muro en vez de encontrar una puerta abierta.

lockout.ts
200
const { data } = await bird.verify.verifications.check({
  to:   { phone_number: "+15551234567" },
  code: guess,
}).safe();

// wrong code, attempts left → { result: "invalid", attempts_remaining: 2 }
// budget spent, session done → { result: "failed", attempts_remaining: null }
Próximamente

Próximamente: señales de fraude y protección contra SMS pumping.

El historial por envío que Verify registra hoy es la base para una capa antifraude que estamos desarrollando ahora. Funciona sobre las mismas llamadas de creación y comprobación, por lo que adoptarla más adelante es un cambio de configuración, no una reintegración.

Señales de riesgo en la creación. Incluya el dispositivo, la IP y el contexto de la solicitud en una verificación: los intentos de alto riesgo reciben un resultado de bloqueo antes de que se envíe un código, para que no pague por enviar mensajes a un atacante.

Protección contra SMS pumping y AIT. Límites de envío por país y por prefijo, más un techo de gasto por workspace, detienen el ataque de tráfico inflado artificialmente que dirige OTP a rangos de números premium para compartir ingresos con operadores.

Construido sobre lo que ya existe. La evaluación de riesgo lee el historial de intentos que Verify guarda desde el primer día, y el resultado de bloqueo ya forma parte del modelo de estados, por lo que la capa antifraude se integra sin modificar su implementación.

Preguntas frecuentes sobre seguridad de verificación

¿Dónde se almacena el código de un solo uso?
Solo como un hash HMAC-SHA256. Bird genera el código con una fuente aleatoria criptográfica, lo envía y conserva el hash para comparar: el texto plano nunca es devuelto por la API ni registrado en los logs.
¿Cómo evitan que alguien adivine el código por fuerza bruta?
Cada sesión tiene un número limitado de comprobaciones (5 por defecto), y cada una se compara en tiempo constante para que el tiempo de respuesta no revele nada. Una vez agotado el presupuesto, la sesión falla, por lo que un atacante no puede seguir intentando.
¿Qué pasa con el SMS pumping y el tráfico inflado artificialmente?
Los límites de envío por destinatario acotan el gasto hoy. La puntuación de fraude dedicada y la protección contra SMS pumping llegarán próximamente, basándose en el historial por envío que Verify ya registra.
¿Estas protecciones tienen un costo adicional?
No. La generación criptográfica, el almacenamiento en hash, las comprobaciones en tiempo constante, el bloqueo por intentos y los límites de envío son el comportamiento estándar de cada verificación: no hay un nivel de seguridad adicional que comprar.
¿De quién ven mis usuarios que proviene el código?
Authifly, la marca de verificación de Bird. Es la identidad en cada código que reciben tus usuarios: el correo electrónico llega desde otp@verify.authifly.com o tu propio dominio verificado, y SMS y WhatsApp llevan la marca Authifly. authifly.com es una página pública que asegura a los destinatarios que Authifly envía códigos de un solo uso legítimos en nombre de una empresa. Bird es la plataforma sobre la que construyes; Authifly es lo que ve el destinatario.

Códigos generados, almacenados y con límites de frecuencia como debe ser.

La seguridad está integrada en Bird Verify, no se vende aparte: los canales, el código y los límites son los mismos dos endpoints.

Empieza con un canal.
Añade los demás cuando estés listo.

Una clave API de prueba es tuya de inmediato. El acceso a producción se desbloquea cuando añades un método de pago y verificas un remitente.

¿Usas Claude Code, Cursor o Codex? Copia un prompt de configuración y tu agente instalará el Bird CLI y las habilidades por ti. Elige el tuyo:

Cursor