Seguridad · En detalle

El ciclo de vida criptográfico completo

Un recorrido preciso por lo que ocurre con tus datos en cada paso, con las primitivas, los parámetros y los límites de confianza explicados. Cada paso empieza con un resumen en lenguaje sencillo, para que leas con el nivel de detalle que prefieras.

Paso 01 · Cifrado

Tu secreto se sella en tu dispositivo

En pocas palabras: el cifrado ocurre en tu navegador, antes de subir nada. Lo que recibimos ya es ilegible.

Cuando pulsas Cifrar, el navegador obtiene una nueva clave de contenido de 256 bits del WebCrypto CSPRNG y cifra tus datos con AES-256-GCM. GCM es autenticado: cada fragmento lleva una etiqueta de 128 bits, así que cualquier manipulación posterior se detecta en lugar de descifrarse sin avisar.

El texto y los archivos se tratan igual: ambos se convierten en un único bloque binario opaco, rellenado hasta un tamaño estándar para que una contraseña corta y un archivo pequeño parezcan iguales. El texto sin cifrar nunca toca la red ni sale de la memoria de la pestaña.

AlgoritmoAES-256-GCM, fragmentos de 64 KiB
Clave de contenido256 bits, nueva para cada secreto
Nonceprefijo aleatorio de 7 bytes + contador
Etiqueta de autenticación128 bits por fragmento
RellenoPadmé, mínimo 64 KiB

Paso 02 · Custodia de la clave

La clave se esconde en el enlace, no en nuestros servidores

En pocas palabras: la parte del enlace que sigue al # contiene la clave, y los navegadores nunca envían esa parte a ningún servidor.

Tu enlace lleva una semilla aleatoria de 256 bits en el fragmento de la URL, es decir, todo lo que va después del #. Según la especificación de URL, el navegador elimina el fragmento y nunca lo incluye en la solicitud que envía a nuestros servidores. A partir de esa semilla, el navegador deriva con HKDF un valor de búsqueda para encontrar el secreto y la clave que desenvuelve la clave de contenido. El servidor solo llega a ver un hash del valor de búsqueda.

El navegador del destinatario lee la semilla del fragmento y hace la misma derivación en local. Esto es lo que significa aquí “conocimiento cero”: tener el texto cifrado no sirve de nada sin el enlace.

Ubicación de la clavefragmento de URL #
¿Se envía al servidor?nunca
Semilla32 bytes aleatorios, base64url
DerivaciónHKDF-SHA-256
El servidor guardasolo SHA-256(búsqueda)

Paso 03 · Frase de contraseña opcional

Un segundo candado que solo tienen las personas

En pocas palabras: si añades una frase de contraseña, ni siquiera alguien con el enlace completo puede abrir el secreto sin ella.

Si pones una frase de contraseña, se refuerza con Argon2id, una función de derivación de claves de uso intensivo de memoria, y se combina con la semilla para obtener la clave que envuelve la clave de contenido. La frase de contraseña en sí nunca se transmite ni se almacena; solo la conocen tú y el destinatario. Los intentos fallidos se repiten en el navegador del destinatario con datos que ya tiene, así que el servidor no puede contarlos.

El uso intensivo de memoria encarece los intentos masivos sin conexión, incluso con GPU y ASIC. Comparte la frase de contraseña por un canal distinto al del enlace y los dos factores nunca coincidirán en un mismo lugar. El módulo Argon2 se descarga en cada creación y en cada visualización, así que la red no puede saber qué secretos usan una.

KDFArgon2id
Sal128 bits aleatorios
EnvolturaAES-256-GCM, IV de 96 bits

Paso 04 · Tránsito y almacenamiento

Solo el texto cifrado sale de tu dispositivo

En pocas palabras: guardamos una caja cerrada y una hora de caducidad. Nada más: ni texto sin cifrar, ni clave, ni registros sobre ti.

El bloque se sube a través de TLS y se almacena en reposo como texto cifrado, junto con credenciales con hash, su duración y una hora de caducidad redondeada. A propósito, no guardamos la identidad del remitente, el destinatario, registros de IP, la hora de creación ni el historial de accesos. No hay un sistema de cuentas que vincule un secreto a una persona. La limitación de frecuencia funciona con un HMAC de la dirección y una sal que rota, así que nada de antes de una rotación puede vincularse con nada de después.

Como el objeto almacenado no significa nada sin la semilla del fragmento, si el servidor se ve comprometido o recibe una orden judicial, solo se obtienen bytes opacos y hashes que no pueden convertirse de nuevo en nada.

En tránsitoTLS
En reposotexto cifrado + claves con hash + caducidad
Registrosninguno por secreto

Paso 05 · Recuperación y destrucción

La primera lectura gana y después se borra

En pocas palabras: abrir un enlace de un solo uso entrega la caja una vez y borra la copia del servidor. O destrúyelo tú mismo cuando quieras.

No se descarga nada al cargar la página para mostrar el secreto: la solicitud solo sale con un clic o una pulsación de tecla reales, así que los escáneres de enlaces y las vistas previas de los chats no pueden consumir un secreto. En un secreto de un solo uso, el servidor reclama la fila con una única actualización condicional (exactamente una solicitud gana) y el secreto cuenta como consumido desde ese momento. El mismo navegador puede volver a descargarlo durante 15 minutos si se corta la conexión; nadie más puede, y una reclamación sin confirmar se destruye, nunca se revierte. Los secretos con tiempo limitado son una lectura normal hasta que caducan.

Cada secreto tiene además un enlace de destrucción privado. Abrirlo no destruye nada por sí solo; al confirmar, el texto cifrado se borra de inmediato, antes de que ningún destinatario pueda leerlo.

Un solo usoreclamación atómica y después destrucción
Plazo para volver a descargar15 min, solo el mismo cliente
Caducidadde 15 min a 14 días
Control del propietarioenlace de destrucción

Modelo de amenazas

Qué puede y qué no puede ver shhnote

La versión honesta. Aquí está exactamente el límite de confianza.

Nunca sale de tu dispositivo

Lo que no podemos ver

Tu texto sin cifrar · la clave de contenido y la semilla · tu frase de contraseña · si se puso una frase de contraseña · quién creó o abrió un secreto · cuándo se creó · registros de acceso a nivel de IP. Nada de esto se transmite ni se conserva.

Almacenado en nuestros servidores

Lo que sí tenemos

Un bloque cifrado que no podemos abrir · su categoría de tamaño con relleno · hashes unidireccionales de los valores que usa tu navegador para encontrarlo o destruirlo · si es de un solo uso o con tiempo limitado · una hora de caducidad redondeada. Todo ello inútil sin la semilla de tu enlace.

Conviene saberlo

Las advertencias honestas

Cualquiera que tenga el enlace completo (y la frase de contraseña, si la hay) puede leer un secreto de un solo uso: trata el enlace como el propio secreto. Después de mostrar un secreto, la página sobrescribe lo que puede cuando sales, pero JavaScript no puede garantizarlo; cierra la pestaña cuando termines. Un navegador controlado por automatización que introduzca acciones reales puede abrir un secreto de un solo uso igual que lo haría una persona; el destinatario no encontrará nada, que es el resultado honesto. Borrar un secreto elimina el registro; pueden quedar restos cifrados en diarios, espacio libre del disco o copias de seguridad hasta que se sobrescriban, como texto cifrado sin clave. Los secretos grandes almacenados fuera de la base de datos conservan la hora en que se escribió el archivo. Y, como con cualquier aplicación web, confías en el código que se envía a tu navegador: por eso shhnote es de código abierto y se puede alojar por cuenta propia.

Especificación criptográfica

Todas las primitivas, en un solo lugar

Cifrado

AES-256-GCM

Cifrado simétrico autenticado en fragmentos de 64 KiB. Una clave de 256 bits más una etiqueta de integridad por fragmento, así que cualquier manipulación o truncamiento se detecta, no solo queda ilegible.

Derivación de claves

HKDF · Argon2id

Las claves y los identificadores se obtienen de la semilla mediante HKDF-SHA-256. Las frases de contraseña opcionales se refuerzan con una KDF de uso intensivo de memoria, lo que hace que la fuerza bruta sin conexión sea lenta y costosa incluso con hardware dedicado.

Aleatoriedad

WebCrypto CSPRNG

Las semillas, claves, sales y nonces salen del generador criptográficamente seguro del navegador. Nunca Math.random(), nunca predecibles.

Custodia de la clave

Fragmento de URL #

La semilla va después del # en tu enlace. Los navegadores nunca transmiten el fragmento, así que nunca llega a nuestros servidores.

En tránsito

TLS

Solo el texto cifrado sale de tu dispositivo, a través de TLS moderno. Lo que recibimos es un bloque opaco que no podemos abrir.

En reposo

Texto cifrado + hashes

Guardamos un bloque cifrado, hashes unidireccionales de sus credenciales y una caducidad redondeada: ni texto sin cifrar, ni claves, ni metadatos del remitente o del destinatario.

Preguntas técnicas

Para quienes se preocupan por la seguridad

¿Cómo se garantiza el uso único frente a condiciones de carrera?

Al mostrar el secreto se ejecuta una única actualización condicional que pasa la fila de “activo” a “reclamado”. Dos solicitudes simultáneas no pueden tener éxito a la vez: la segunda encuentra un registro ya reclamado y recibe la misma respuesta de “no se encontró ningún secreto” que cualquier otra persona. La reclamación nunca se revierte: si la descarga se pierde, quien tiene el token de reclamación vuelve a descargarlo dentro del plazo; de lo contrario, el secreto se destruye sin leerse.

¿Por qué el fragmento de la URL y no un parámetro de consulta?

Los parámetros de consulta se envían al servidor y acaban en registros de acceso, proxies y herramientas de analítica. La especificación de URL define que el fragmento (lo que va después de #) se quede en el cliente: el navegador nunca lo incluye en la solicitud HTTP. Esa propiedad es la base de todo el diseño de conocimiento cero. Después de mostrar el secreto, la página también elimina el fragmento de la barra de direcciones y del historial.

¿Qué impide que los escáneres de enlaces destruyan antes de tiempo los secretos de un solo uso?

La página de visualización es el mismo documento estático para todos los secretos y no descarga nada al cargarse. La solicitud solo se envía con un clic o una pulsación de tecla de confianza: un click() desde un script o el envío de un formulario no cuentan. Los escáneres automáticos (seguridad del correo, vistas previas de chats, antivirus) solo llegan a cargar esa página estática.

¿Puedo verificarlo o alojarlo yo mismo?

Sí. Todo el código fuente es público bajo AGPLv3, el protocolo está documentado en una especificación con vectores de conformidad con los que cualquier implementación puede comprobarse, y hay una guía de autoalojamiento. Puedes auditar la criptografía del lado del cliente y tener tu propia instancia, de modo que el límite de confianza sea completamente tuyo.

¿Se registra algo para prevenir abusos?

No guardamos registros de acceso por secreto ni historial de IP. La limitación de frecuencia usa un hash con clave de la dirección, con una sal que rota y que, al rotar, borra todos los contadores. Las denuncias de abuso se cuentan por día; no queda constancia de qué secreto se denunció.

Consejos para compartir de forma segura

  • Envía la frase de contraseña por una vía distinta a la del enlace; por ejemplo, el enlace por correo y la frase de contraseña por teléfono.
  • Elige la caducidad más corta que te sirva.
  • Usa un secreto de un solo uso para contraseñas y otra información que deba leerse exactamente una vez.

Informar de una vulnerabilidad

Si crees que has encontrado un problema de seguridad en este sitio, escríbenos a [email protected] y avísanos en privado antes de contárselo a nadie más. Incluye lo que encontraste y cómo reproducirlo.

Nos comprometemos a:

  • responder en un plazo de 5 días hábiles;
  • mantenerte informado mientras lo corregimos;
  • reconocer tu aportación cuando publiquemos la corrección, si así lo deseas.

Mientras haces pruebas, no accedas a datos de otras personas, no interrumpas el servicio ni ejecutes escaneos automatizados que lo sobrecarguen.

Vulnerabilidades en el propio software shhnote: consulta la política de seguridad del proyecto.

Crear un secreto Ver el código en GitHub

Pruébalo: solo tardas diez segundos

Escribe algo secreto, obtén tu enlace de un solo uso y míralo desaparecer.

Crear un secreto