Operaciones pega un enlace de un solo uso en un canal de Slack. Aparece primero la tarjeta, con el nombre del sitio en el título. Diez minutos después el destinatario abre y lee «Este secreto ya se destruyó». Los dos lados están seguros de no haber visto el texto plano. Lo que tocó el servidor primero no suele ser el dedo del compañero, sino el GET que Slack envía para una vista previa del enlace.
Un texto anterior explicaba por qué la clave de un enlace de un solo uso va detrás del #: la pregunta era si el anfitrión que guarda el texto cifrado ve la clave. Aquí la pregunta es más estrecha: si la vista previa puede gastar la lectura antes de que nadie pulse. La clave sigue detrás de #. Crear y leer se abren sin cuenta. El enlace de un solo uso de MyPassGen se usa al momento; las lecturas empiezan en 1 y el tope es 10. Esto no es un recorrido por los botones. Seguimos lo que ves en Red, en la barra de direcciones y en la ventana del chat.
Primero, dos hechos distintos
Que la vista previa queme el texto cifrado no es la misma pregunta que si el historial del chat sigue guardando la URL completa. Una vista previa que solo recupera HTML y no ejecuta scripts de página suele no obtener la clave detrás de # y no llega a la interfaz de recuperación. En el canal, la cadena entera s.html?id=…#… sigue ahí. Quien la copie puede abrir. Una vista previa que no ha quemado no significa que el enlace haya dejado de ser una credencial.
El otro dice destruido, tú no has clicado
Un diseño de un solo uso habitual es: la primera recuperación se lleva el texto cifrado y el servidor lo borra. Cuando el número de lecturas vale 1, esa única respuesta es la última copia. Entre «creado» en el remitente y «destruido» en el destinatario pueden aterrizar muchas visitas que no son un clic humano: vista previa del canal, escaneo del correo, pasarela de empresa que reescribe la URL y luego la sondea.
Slack lo escribe en la documentación de producto. Unfurling links in messages indica: cuando un usuario pega un enlace, Slack recupera la página y le adjunta una vista previa. La página oficial de robots nombra al robot que hace esa recuperación Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots), y precisa: toma lo menos posible de la página (HTTP Range) para extraer las etiquetas oEmbed, Twitter Card y Open Graph. Si esas etiquetas apuntan a una imagen, un vídeo o un archivo de audio, también recupera ese archivo para comprobarlo. Slack Robots añade: las respuestas de una misma URL se cachean en el servicio unos 30 minutos; Slack no respeta robots.txt en esta recuperación, porque actúa en nombre de quien ya ha publicado el enlace, no como un rastreador de todo el sitio.
Una tarjeta ya visible en el canal solo prueba esto: una máquina que no es el destinatario ha enviado al menos una petición HTTP a la dirección pegada. No prueba que se haya leído el texto plano. No prueba que el texto cifrado se haya contado como una lectura. Para saber si está quemado hay que ver qué capa tocó esa petición.
Qué trozo de URL envía de verdad la vista previa
El enlace completo que copias tiene esta forma: …/s.html?id={id}#{key}. El id detrás del interrogante entra en la línea de petición HTTP. La clave detrás de la almohadilla se queda, según el protocolo, en el cliente. Ver RFC 3986 §3.5 y RFC 9110 §7.1: el URI de destino excluye el fragmento, porque ese trozo lo trata el cliente. Un robot de vista previa envía un GET HTTP normal. Una línea de petición lícita es GET /es/s.html?id=…. La clave detrás de la almohadilla no llega a la máquina que aloja el texto cifrado.
Por eso una vista previa que solo toma HTML no suele poder descifrar. La página de lectura tiene que, por script, leer location.hash, pedir el texto cifrado al servidor y descifrarlo en este aparato con AES-256-GCM. El rastreador de vista previa no tiene la clave del fragmento: solo un identificador. Aunque guarde todo el HTML de s.html, no hay contraseña dentro. La página de lectura es una landing noindex. El HTML inicial lleva un título genérico. El texto plano solo se escribe en la página cuando termina el script.
Lo que el chat guarda es otro objeto. Se pegó la cadena entera, almohadilla y clave incluidas. La búsqueda del canal, la sincronización de mensajes y la misma conversación en un teléfono nuevo siguen devolviendo la credencial completa. Poner la clave detrás de # la saca del GET de vista previa y de los registros de servidor habituales. No la saca del historial del grupo. Para una entrega más sensible se pueden partir el identificador y la clave en dos canales; más abajo.
Tres recuperaciones, solo una cuenta
RFC 9110 define GET como método seguro: enviarlo no debe tener un efecto de lado destructor. Recuperar una página solo para dibujar una tarjeta no debería, según esa semántica, borrar el texto cifrado. En la práctica, una herramienta de un solo uso que trata «el primer GET del documento» como una lectura deja que el robot de vista previa queme el secreto antes que el destinatario. La diferencia no es el nombre del chat. Es a qué petición está atado el contador.
Ordena las recuperaciones por lo que pueden ejecutar. La primera toma el HTML inicial, parsea <title> y Open Graph, y no ejecuta script de página. La descripción oficial de Slack sobre Link Expanding encaja aquí: extrae etiquetas meta y, si hace falta, recupera el medio que nombran. Apple, en Ensuring Beautiful Rich Links, dice que al generar un enlace enriquecido no se ejecuta JavaScript, así que Open Graph tiene que estar en el código fuente. Las incrustaciones de Discord en un canal suelen hacerse igual: Discordbot/2.0 lee el HTML inicial, no abre un motor de navegador completo.
La segunda ejecuta el script de la página, pero la petición sigue sin fragmento. Ahí entran los navegadores sin interfaz y algunos sandboxes de escaneo empresarial. Pueden ejecutar el JavaScript de la página de lectura y aun así no leer location.hash. En este sitio, sin clave no hay recuperación del cifrado. La página debería detenerse en «El enlace está incompleto». El recuento de lecturas no debería moverse.
La tercera ejecuta script y carga la URL completa —almohadilla incluida— en un entorno de página de verdad. Algunos productos de protección del puesto que abren «el enlace que vas a pulsar» en un WebView local, o una vista previa que carga la página entera en el aparato del remitente, pueden llegar a «recuperar el cifrado y sumar el contador». El protocolo no descarta esta clase. Solo puedes reproducirla con un enlace de prueba en el mismo canal.
Slack, WhatsApp, WeChat y el correo
Slack es el camino más fácil de comprobar. La página oficial de robots publica un User-Agent. Puedes pedir la página de lectura con esa misma cadena y ver si la respuesta es HTML estático, y si el recuento de lecturas se movió después. Slack también documenta la caché global de unos 30 minutos: la misma URL pegada en varios canales en poco tiempo no siempre vuelve a golpear tu origen. Un título de sitio en la tarjeta solo significa que se leyeron las etiquetas meta o el <title>. El título por defecto de la página de lectura en español es «Mensaje autodestructivo · MyPassGen». No contiene tu frase de prueba.
WhatsApp y WeChat no publican una página de robots al estilo de Slack, así que no puedes tratar la capacidad de su rastreador interno como un contrato documentado. Lo que sí ves al momento: tras pegar la URL, ¿aparece una tarjeta de título; tras el clic del destinatario, la página de lectura ¿descifra, está incompleta o ya se destruyó. En mensajería instantánea de ese tipo, las tarjetas suelen construirse con un servidor que recupera título y resumen del HTML, no ejecutando primero el script de lectura en el teléfono del destinatario. Sin especificación pública, fíate del resultado de tu enlace de prueba. No trates «apareció una tarjeta» como «se recuperó el texto cifrado».
El correo de empresa es un tercer camino. Microsoft, en la información sobre Vínculos seguros, indica que el correo entrante se escanea y las URL pueden reescribirse; al hacer clic se verifica de nuevo. Las direcciones reescritas llevan un prefijo como safelinks.protection.outlook.com. El escaneo al entregar y la redirección al pulsar pueden emitir otro GET hacia el destino. Comprueba dos sitios: si el cuerpo que ves ya viene envuelto, y si la barra de direcciones sigue llevando el trozo detrás de # después del clic. Si la clave se pierde en la reescritura o la redirección, la página de lectura debería decir que el enlace está incompleto, no descifrar el secreto. Si la URL completa —almohadilla incluida— entra en un sandbox que ejecuta script, una lectura puede contar. No asumas que toda pasarela «solo mira HTML». Los enlaces en canales de Microsoft Teams también pueden pasar por Vínculos seguros; la política depende del inquilino.
Qué peticiones hace la página de lectura
Cuando se abre la página de lectura de MyPassGen, el script hace dos cosas en orden. Primero consulta el estado por identificador: esa petición responde si el secreto sigue ahí, ya se destruyó o caducó, y no incrementa el recuento de lecturas. Sin clave detrás de #, se detiene ahí y la página dice que el enlace está incompleto. Con clave, emite entonces la GET del texto cifrado. Esa petición es la que incrementa read_count. Cuando el recuento llega al límite que fijaste (por defecto 1, máximo 10), el servidor borra el texto cifrado. La siguiente apertura es un estado destruido. La caducidad sigue el TTL que elegiste al crear: 1 hora, 24 horas, 7 días, o solo por número de lecturas, sin TTL.
Así, una vista previa que solo hace GET de s.html?id=…, y un escáner que solo toca el endpoint de estado, no gastan esa lectura. Lo que gasta una lectura es la petición de cifrado que emite «el script de la página de lectura que ya tiene la clave». Al crear, el navegador cifra en este aparato con AES-256-GCM, un IV de 12 bytes y un tope de 32 KB de texto plano. El servidor solo guarda texto cifrado. La clave no entra en la línea de petición HTTP. Cómo comprobar el algoritmo y que el texto plano no se subió está en Cómo comprobar que el cifrado en el navegador no sube el texto plano.
La página de lectura no tiene un botón aparte de «Revelar». Cuando la clave está presente, abrir la pestaña recupera el cifrado. Eso no contradice «los rastreadores de vista previa solo toman HTML»: esos rastreadores casi nunca llegan al paso de recuperación. La contradicción aparece en la tercera clase: una URL completa cargada en un entorno que ejecuta script. Entonces se parece a una persona que abrió la pestaña, y un enlace con 1 por defecto se gasta. No puedes adivinar la clase por el estilo de la tarjeta. Solo puedes mirar el estado, como en la sección siguiente.
Si la vista previa no quemó, el hilo sigue siendo una credencial
Un enlace completo en un canal de Slack, un chat de WhatsApp o WeChat, o un hilo de correo sigue siendo una credencial: solo un paso extra hasta el texto plano. Quien pueda buscar ese mensaje puede abrirlo antes de que se destruya. Cerrar una ventana de Incógnito no quita una URL completa ya guardada como marcador o sentada en Descargas. Ver Al cerrar la ventana de Incógnito, la contraseña sigue en Descargas, los marcadores y el portapapeles.
Qué queda después de la vista previa
Con el mismo enlace de prueba y lecturas en 1, remitente y destinatario no ven los mismos objetos después de una vista previa. La tabla se escribe en páginas que puedes abrir, no en eslóganes de producto.
| Qué ocurrió | Qué suele mostrar la ventana del chat | Al abrir de nuevo el enlace completo deberías ver |
|---|---|---|
| Solo meta HTML, sin script | Una tarjeta de título, sin la frase de prueba | Sigue descifrando la frase de prueba |
Se ejecutó script, pero la petición no tenía # |
Tarjeta o vista previa en blanco; el servidor vio una consulta de estado | Sigue descifrando; la visita sin clave debería decir incompleto |
| La URL completa se cargó en un entorno que ejecuta script | Tarjeta o informe de escaneo; la lectura se gastó | Destruido o caducado, sin texto plano |
| La pasarela de correo reescribió la URL y perdió el fragmento al redirigir | Una dirección envuelta tipo safelinks… |
Enlace incompleto; el cifrado suele seguir ahí |
No mezcles la cuarta fila con la tercera. Si se perdió la clave, el destinatario no abre el secreto, pero el remitente todavía puede abrir la URL original completa: el recuento no se gastó; el destinatario solo tiene una dirección recortada. Si la clave sigue ahí y la página ya está destruida, una vista previa o un escaneo leyó primero. El primer caso pide reenviar el trozo detrás de la almohadilla. El segundo pide un enlace nuevo. No hay copia de texto plano en el servidor, ni un buzón de soporte que pueda recuperar un secreto destruido.
Compruébalo en el momento
Estos pasos no dependen de ninguna promesa de marca. Usa una frase de prueba que no pueda iniciar sesión en una cuenta real, por ejemplo orange-lake-7. No ensayes con la contraseña maestra en servicio, una clave de producción ni un enlace de un solo uso de verdad.
- Abre Un solo uso, pega la frase de prueba, pon caducidad a 24 horas, deja las lecturas en 1 y crea el enlace. Anota la dirección completa y confirma que la forma es
s.html?id=…#…. Sin registro. - Copia solo la parte anterior a la almohadilla. Desde un terminal, pide esa URL con el User-Agent de Slack, por ejemplo
curl -A "Slackbot-LinkExpanding 1.0 (+https://api.slack.com/robots)" "https://mypassgen.com/es/s.html?id=…". La respuesta debería ser el HTML de la página de lectura. El título o el cuerpo no deberían contener la frase de prueba. Esto solo prueba «una recuperación de documento no ve texto plano». No sustituye a un chat real. - Abre en el navegador la misma dirección «solo id, sin clave». Deberías ver El enlace está incompleto, no el secreto. Abre las herramientas para desarrolladores, pestaña Red, y activa Conservar registro: deberías ver una consulta de estado y no una recuperación posterior del cifrado con éxito.
- Abre de inmediato el enlace completo (con
#) en otra pestaña. Debería descifrar la frase de prueba. Si el paso anterior ya lo quemó, la implementación o un equipo intermedio trató una visita sin clave como una lectura: detente aquí. No envíes un secreto vivo. - Crea otro enlace de prueba con lecturas en 1. Pega la URL completa en un canal de Slack que controles, en Transferencia de archivos de WeChat, en un chat de WhatsApp de prueba o en un grupo privado. Espera la tarjeta de vista previa (o confirma que no hay). No abras la página de lectura.
- Tras aparecer la vista previa, abre el mismo enlace completo en el navegador del ordenador. Si sigue descifrando, la vista previa de ese canal es de las dos primeras clases. Si ya está destruido, algo en el medio ejecutó la tercera —o uno de tus propios aparatos precargó la página con clave. Crea un enlace nuevo si aún tienes que enviar. Tras leer, sobrescribe el portapapeles como en Después de copiar una contraseña, quién más puede leer el portapapeles. No guardes en marcadores una dirección que aún lleve
#.
Para el correo de trabajo, añade medio paso: envíate el enlace de prueba a tu propia bandeja, mira si el cuerpo viene envuelto como una dirección de Vínculos seguros, y luego si la barra de direcciones sigue llevando la clave después del clic. Si la clave desapareció, manda el identificador por correo y la clave por teléfono. Si se quemó, sube el recuento o cambia de canal. MyPassGen no clasificará la pasarela de un proveedor por ti. Fíate de las ventanas que acabas de abrir.
Cuando el canal construye tarjeta de todos modos
El valor por defecto de 1 lectura encaja con «la otra persona tiene el enlace completo, lo abre ahora y luego desaparece». Para un canal, un grupo grande o una lista de correo que dibuja tarjetas, recorre primero la sección anterior con un enlace de prueba. Confirma que la vista previa no cuenta y entonces envía el secreto de verdad. Si la prueba ya se quemó, no esperes que subir el recuento haga «segura» la vista previa. Pasar el límite a 2 solo deja una apertura humana extra. Un escáner que ejecute script cada vez puede agotar el recuento igual.
Un corte más sólido usa dos canales. Un mensaje lleva solo s.html?id=…. La vista previa entonces obtiene, como mucho, un identificador y un título genérico. El otro canal —una llamada, en persona o otra cuenta de mensajería— lleva solo el trozo detrás de #. Ninguna mitad descifra sola. Es un patrón de uso, no un valor por defecto del producto. La página de creación sigue emitiendo un enlace completo, cómodo para una entrega uno a uno.
Genera la contraseña en este aparato. No la escribas en el grupo para luego borrar el mensaje. El generador de contraseñas de MyPassGen usa un modo aleatorio de 6–128 caracteres, 16 por defecto, y avisa por debajo de 8. Se abre sin cuenta. El resultado no se sube como dato de negocio. Un paquete de certificados o una exportación de más de 32 KB no caben en un enlace de texto de un solo uso. Usa Cifrar: AES-256-GCM en flujo en el navegador, un archivo de hasta 5 GB, salida .lock / .enc, contraseña por otro canal. El disco en la nube solo guarda texto cifrado. Ver Antes de dejar un archivo en la nube, quién puede leer el texto plano.
Cuando hayas comprobado «¿el enlace completo sigue descifrando después de la vista previa» y «¿el hilo sigue guardando una credencial completa», ya puedes responder la pregunta de este artículo: una vista previa que solo toma HTML suele no quemar primero el enlace de un solo uso de este sitio. Una recuperación que ejecuta script y lleva #, sí. La tarjeta no te dice en qué clase caíste. La página de estado y una segunda apertura, sí.
Preguntas frecuentes
El canal de Slack ya muestra una tarjeta de vista previa. ¿El enlace está muerto?
No necesariamente. La documentación de Slack dice que Link Expanding extrae etiquetas meta y usa Range para tomar lo menos posible de la página. Una tarjeta solo prueba que se recuperó el HTML de la página de lectura. Abre el enlace completo una vez más: si sigue descifrando, el recuento está intacto; si está destruido, crea uno nuevo. No sigas recargando la misma URL a ver si vuelve.
WhatsApp y WeChat no tienen página pública de robots. ¿A qué frase te fías?
Al resultado de este enlace de prueba. Una tarjeta de título solo significa que algún programa leyó un título o un resumen. Antes de que el destinatario pulse, abre tú el enlace completo: si sigues viendo la frase de prueba, la vista previa de ese canal no recuperó el cifrado; si está destruido, parte la URL o envía uno a uno.
Si pones las lecturas en 2 o 3, ¿eso derrota a la vista previa?
Solo deja huecos extra de recuperación. No convierte la vista previa en un método seguro. Un escáner que ejecute script con la clave cada vez puede gastar el recuento igual. Primero usa un enlace de prueba con 1 lectura para ver si la vista previa es de las dos primeras clases. Si tienes que usar un canal inestable, entonces sube el recuento y acepta que una persona más podría abrir.
¿Crear y leer exigen una cuenta? ¿Un robot de vista previa cuenta como lector?
Sin registro. Crear y leer son públicos para un visitante. Un robot de vista previa que solo recupera HTML no es una lectura. Si emite la GET del cifrado, el servidor no puede distinguirlo de una persona y el recuento baja igual. La página de lectura es pública para el destinatario. No hay puerta de inicio de sesión, ni un buzón de soporte que pueda recuperar un secreto destruido.