Security

What is protected and what is not.

A security tool that only lists strengths is not credible. This is the full threat model: what ExoSeal protects against, where it ends and how you check everything yourself.

protects

Database or backup leaks. Only ciphertext is stored. Secrets are single-use and short-lived.

Curious operators. Whoever reads the database or logs finds no key, no plaintext and no IP addresses.

Link preview bots. Slack, Teams or Outlook only fetch links. Opening needs a click on a button, so a bot consumes nothing.

Mistyped passwords. The passphrase is checked in the browser before the reply is fetched and deleted.

Swapped public keys. The customer link carries a fingerprint of the key. If it does not match, the browser stops.

Parallel opening. Opening and answering are single database statements. With 30 to 40 parallel attempts exactly one wins.

Script injection. Strict Content-Security-Policy with a nonce per request and no external sources.

Foreign pages and other subdomains. The server accepts writing calls only from its own origin (Sec-Fetch-Site, Origin). A foreign or hacked page under the same main domain cannot create or delete anything in your name.

Overload and a full database. Rate limits count signed-in users one by one and everyone else by IP. Every user has a quota (500 running links, 200 running requests), so a hijacked account cannot fill the database.

does not protect

A tampered server. The encrypting code comes from the server. Whoever takes over the server can ship modified code. That is why ExoSeal is open source and self-hostable. For very high stakes use a native tool such as age or GPG.

A short passphrase. For requests the wrapped private key is stored encrypted on the server. 600,000 iterations slow guessing down, but a short passphrase will still fall. Use a long sentence.

A forgotten passphrase. There is no recovery. The reply is gone.

A compromised device. Malware, shoulder surfing or clipboard managers on either side.

Metadata. The server knows that a request exists, when it was created, answered and opened, and who owns it, and which user created a link and when. It does not know the recipient or the content. The reverse proxy sees IP addresses unless you turn logging off.

The full link in the wrong hands. Whoever opens the complete link before the recipient wins. If the recipient finds the link used up, something is wrong.

A stolen session. The session lasts a fixed 8 hours. "Sign out" deletes the cookie in the browser; the server cannot end a stolen session early. The cookie is HttpOnly and the strict CSP stops scripts from reading it.

How to check it yourself.

You do not have to take our word for it. Three ways to verify every claim.

Read the source

Encryption lives in the frontend, storage rules in the backend. Both are open under AGPL-3.0 and short enough to read in an afternoon.

Look in the browser

Open the developer tools, Network tab. When you open a link, nothing after the # ever goes to the server. The browser decides that, not us.

Run it yourself

With a compose file and your own login provider, ExoSeal runs on your server. Then trust depends only on you.

Another question about security?

The most common questions are answered, and the guides show every step.