Zero-Knowledge · Compartir PDF

Compartir PDF zero-knowledge, explicado en serio.

"Cifrado de extremo a extremo" se usa a la ligera. Aquí está el mecanismo criptográfico real detrás de un enlace PDF zero-knowledge — AES-256-GCM, gestión de claves, modo fragmento vs frase y lo que el servidor literalmente no puede hacer.

lockAES-256-GCM vpn_keyPBKDF2-SHA256 · 310,000 linkFragmento o frase memoryWeb Crypto API

Qué significa "zero-knowledge" aquí

Una definición útil, sin marketing: el servicio que almacena tu archivo compartido no tiene conocimiento — ni criptográfico ni operacional — que pueda usarse para descifrarlo. La clave nunca toca el servidor, por lo que el servidor no puede revelarla en ninguna circunstancia.

memory
El cifrado ocurre en tu navegador
No en el servidor, ni en un worker que no controlas — en tu pestaña, con window.crypto.subtle. Verificable en DevTools.
cloud_off
Solo se sube el cifrado
El cuerpo subido es cifrado AES-256-GCM. El PDF, el nombre del archivo y los metadatos nunca llegan al servidor en forma legible.
vpn_key
La clave viaja con el destinatario
O en el fragmento URL (que nunca se envía al servidor) o derivado de una frase que elige el emisor. En cualquier caso, nunca la vemos.
block
Sin recuperación = sin puerta trasera
¿Perdiste el enlace u olvidaste la frase? El archivo se fue para siempre. Zero-knowledge significa que la vía de recuperación que debilitaría la garantía no existe.

Cómo se construye un enlace PDF zero-knowledge

Recorrido de lo que hacen el navegador del emisor, el servidor y el navegador del destinatario — con las llamadas reales a Web Crypto.

1 — Navegador del emisor
// 256-bit AES key, generated locally key = crypto.subtle.generateKey({name:"AES-GCM", length:256}) // fresh 96-bit IV per file iv = crypto.getRandomValues(new Uint8Array(12)) // encrypt locally; GCM gives us an auth tag for integrity ct = crypto.subtle.encrypt({name:"AES-GCM", iv}, key, pdfBytes) // upload ciphertext + iv (and salt, if passphrase mode) id = await PUT("/api/transfer", ct, {iv, expiry})
2 — Forma del enlace
// fragment mode: key lives after # link_f = `https://pdfpro.tools/s/${id}#${b64url(rawKey)}` // passphrase mode: no key in the link; recipient must know the passphrase link_p = `https://pdfpro.tools/s/${id}`
3 — El servidor guarda bytes opacos
ciphertext = ??? // random-looking, unreadable iv = 12-byte nonce salt = 16-byte random (passphrase mode only) expiry = 24h free / 30d Pro
4 — Navegador del destinatario
// browsers never transmit the URL fragment to the server rawKey = /* from location.hash OR */ PBKDF2(passphrase, salt, 310_000, "SHA-256") ct = await GET("/api/transfer/" + id) pdf = crypto.subtle.decrypt({name:"AES-GCM", iv}, importKey(rawKey), ct) // browser serves pdf to Downloads

Modo fragmento vs modo frase

Dos formas de llevar la clave al destinatario. Misma garantía de cifrado, distintos trade-offs de usabilidad y fuga.

Modo Fragmento

La clave viaja en el hash URL (#)

El flujo más simple: copia el enlace, pégalo en un chat al destinatario, listo. La parte de la URL tras # no la envía ningún navegador conforme a ningún servidor — eso es lo que mantiene la clave privada.

  • Un paso para el destinatario — hacer clic en el enlace.
  • Baja fricción, apto para compartir de sensibilidad baja a media.
  • Riesgo: si el enlace se filtra en una captura o sincronización del navegador, el archivo se filtra con él.
  • Úsalo cuando confíes en el canal (mensajería firmada, chat interno).
Modo Frase

Clave derivada de una frase (PBKDF2)

El emisor elige una frase. El navegador deriva una clave de 256 bits con PBKDF2-SHA256 y 310.000 iteraciones sobre un salt aleatorio de 128 bits. El salt se guarda en el servidor; la frase se comparte por otro canal (teléfono, Signal, en persona).

  • Compartir en dos factores: el enlace y la frase viajan por separado.
  • El enlace solo no basta — el cifrado sigue ilegible.
  • La fuerza de la frase importa: 310k iteraciones ralentizan la fuerza bruta pero no salvan una frase de 6 caracteres.
  • Úsalo cuando el enlace pueda ser reenviado o guardado en un sitio en el que no confíes plenamente.
PropiedadModo fragmentoModo frase
Portador de claveHash URL (#)Frase + salt
¿El servidor ve la clave?NoNo
El servidor guardaCifrado + IVCifrado + IV + salt
Fricción del destinatarioClic al enlaceClic + escribir frase
Filtrable por capturaSí (enlace = clave)No (enlace solo inútil)
Resistente a fuerza bruta256-bit aleatorioDepende de la frase
Mejor paraCompartir con baja fricción por canales de confianzaCompartir más sensible

Por qué un cifrado guardado en servidor aún te protege

La gente suele preguntar: "si está en tu servidor, ¿cómo es privado?" La respuesta es que el cifrado no es el archivo. Sin la clave, son bytes de apariencia aleatoria. Aquí lo que significa en la práctica.

storage
Brecha de base = fuga de cifrado
Si un atacante compromete nuestra base de datos, se llevaría bytes opacos. Recuperar un solo archivo requeriría fuerza bruta sobre una clave de 256 bits — no es viable con la física conocida.
gavel
Una citación produce cifrado
Un juez puede obligarnos a entregar lo que tenemos. Lo que tenemos es cifrado. Una orden judicial no puede crear retroactivamente una clave que nunca guardamos.
group
El acceso interno queda neutralizado
Un empleado deshonesto con credenciales completas de la base aún no puede leer archivos. La garantía la impone la matemática, no el control de acceso.
timer
La expiración refuerza la garantía
El cifrado se borra al expirar (24 h gratis, hasta 30 d en Pro). Después, hasta el cifrado desaparece — la única copia del archivo existe donde se descifró.

warningLimitaciones honestas

Zero-knowledge no resuelve la seguridad del endpoint. Malware en el dispositivo del emisor o destinatario puede robar la clave de memoria. Una extensión de navegador comprometida puede leer el archivo descifrado. Y un enlace reenviado en un chat grupal anula toda garantía criptográfica. La arquitectura eleva el coste de una brecha; no elimina todo el riesgo.

Zero-knowledge vs otras opciones "seguras"

Una comparación clara de opciones comunes para compartir un PDF. La mayoría etiquetadas como "seguras" están cifradas en transporte pero no son zero-knowledge.

OpciónTLS en tránsitoEl servidor puede leer el archivoExpiraciónCuenta del destinatario
Adjunto de emailNormalmente síSí — en cada saltoPara siempreNo requerida
Enlace genérico en la nubeOpcionalA veces
PDF protegido con contraseñaSí (si el host tiene el archivo)NuncaNo requerida
PDF Pro (modo fragmento)No24h / 30dNo requerida
PDF Pro (modo frase)No24h / 30dNo requerida

Preguntas frecuentes

¿Qué significa realmente compartir PDF zero-knowledge?
Significa que el servidor que guarda tu archivo compartido literalmente no puede descifrarlo. La clave se genera en el navegador del emisor, nunca se sube y solo el navegador del destinatario puede reconstruirla — del fragmento URL o de una frase que el emisor comparte por otro canal. La garantía la impone la criptografía, no una política de control de acceso que podamos cambiar.
¿Qué cifrado usa PDF Pro para compartir zero-knowledge?
Cifrado simétrico AES-256-GCM con un IV aleatorio de 96 bits por archivo. En modo frase, las claves se derivan con PBKDF2-SHA256 y 310.000 iteraciones sobre un salt aleatorio de 128 bits. Toda la cripto corre en la Web Crypto API nativa del navegador.
¿Cuál es la diferencia entre modo fragmento y modo frase?
El modo fragmento pone la clave de 256 bits en el hash URL (tras #), que los navegadores nunca envían a ningún servidor. Cualquiera con el enlace completo puede descifrar. El modo frase deriva la clave de una frase que elige el emisor; sin ella el cifrado sigue ilegible. Si el enlace se filtra, el modo frase es más seguro; el fragmento es más fácil para compartir con poca fricción. Ver la tabla de comparación arriba.
¿Un fragmento URL es realmente seguro como portador de clave?
Los navegadores conformes nunca transmiten la parte fragmento de una URL (tras #) al servidor. Queda en el cliente y solo es visible para JavaScript en la pestaña del destinatario. Eso es lo que hace del enlace compartido la credencial de descifrado — la clave viaja con el destinatario, no con la subida. Se puede verificar en la pestaña Red: la URL de la petición se trunca en ? o #.
¿Pueden PDF Pro o un juez leer archivos guardados con zero-knowledge?
No. El servidor guarda cifrado AES-256-GCM más un IV (más un salt en modo frase). Sin la clave — que nunca recibimos — esos datos son criptográficamente indistinguibles de bytes aleatorios. Solo podemos entregar cifrado, que es lo que tenemos.
¿Qué pasa si pierdo el enlace u olvido la frase?
El archivo es permanentemente irrecuperable. Es por diseño — zero-knowledge significa que no hay vía de recuperación, porque la habría solo si tuviéramos la clave. Guarda la frase en un gestor y el enlace en sitio duradero.
¿Compartir PDF zero-knowledge es gratis?
Sí. El nivel gratuito soporta cifrado AES-256-GCM y expiración de 24 horas sin registro. El límite gratuito es unos 25 MB por transferencia; Pro amplía la ventana de expiración a 30 días y sube los límites de tamaño.
¿El destinatario necesita cuenta?
No. El destinatario hace clic en el enlace, su navegador descifra localmente con la Web Crypto API y descarga el archivo — sin registro, sin instalación, sin muro de portal entre él y el archivo.

Envía un enlace zero-knowledge. Deja que expire según el calendario.

Cifrado AES-256-GCM en tu navegador. Sin registro, sin texto plano en servidor, sin puerta trasera de recuperación.

sendCrear un Enlace Cifrado