Security
Threat Model
A security tool is only meaningful relative to a specific adversary. This page lists the attackers we designed against, states honestly where the design stops working, and tells you when you should be using something else.
Why an explicit threat model matters
"Is this secure?" is not an answerable question. "Secure against whom, doing what?" is. A tool that comprehensively defeats a database breach may be useless against malware on your laptop, and saying so is the difference between a security product and a security-flavoured one.
The cost of vagueness is real. Someone who believes a tool protects them against an adversary it does not defend against will take a risk they would otherwise have avoided. That is a worse outcome than using nothing.
Adversaries Inkrypt defends against
An attacker who breaches our database
Strongly defended. An attacker who exfiltrates every row obtains AES-256-GCM ciphertext, per-note random salts and IVs. There is no master key to steal, because none exists. Each note must be attacked independently, offline, against whatever password protects it — and per-note salting means cracking one gives no advantage on the next.
A network attacker
Strongly defended. All traffic is TLS, but more importantly the plaintext never enters the network at all. Even a complete break of TLS on a given connection would reveal only ciphertext, a salt and an IV.
Us — the service operator
Strongly defended, structurally. There is no code path in which our servers hold a decryption key. This is not a promise not to look; it is the absence of the capability to look. It follows that a legal demand can only produce ciphertext.
Someone who obtains only the share link
Defended, provided you split the channels. A share token retrieves ciphertext; the password decrypts it. Someone with just the link holds unreadable data. This protection evaporates entirely if you send both in the same message — see secure link sharing.
Long-term accumulation of secrets
Defended by expiry. The specific risk that a credential shared in 2023 is still readable in a chat archive today is addressed directly: expiry and view limits make deletion the default outcome rather than a manual chore nobody performs.
Adversaries only partially mitigated
An offline password-guessing attack
Partially mitigated. PBKDF2 at 310,000 iterations multiplies the cost of every guess, and per-note salts prevent precomputation and amortisation. But an attacker holding your ciphertext can grind at their own pace with no rate limit we can impose. Against a weak password, key stretching buys time and nothing more.
Your password is the binding constraint on this entire system. Four or more random words moves it from "hours" to "not worth attempting".
Automated link scanners
Partially mitigated. Corporate mail filters and chat link-preview bots fetch URLs automatically, which can consume a view-limited link before the human clicks. They obtain only ciphertext, so this is an availability problem rather than a confidentiality one — but it is a real and common annoyance. Allow two or three views when sending into a filtered environment.
Traffic and metadata analysis
Partially mitigated. We cannot read notes, but we necessarily observe that a request occurred, when, and against which slug. Slugs are not encrypted. An observer with access to our logs learns nothing about content but does learn that a note by a given name existed and was fetched.
Adversaries Inkrypt does not defend against
Malware on your device
Not defended. A keylogger or infostealer on your machine sees plaintext as you type it and captures the password as you enter it. Encryption happens after that point. No browser-based tool can defend below its own layer — if your endpoint is compromised, nothing running on it can be trusted.
The recipient
Not defended, and not defensible. Once someone can read a note they can screenshot it, copy it, photograph the screen or simply remember it. Expiry controls availability from our servers; it has no reach into anyone's memory or clipboard. Any product implying otherwise is misleading you.
A compromised or malicious code-delivery layer
Not defended. We serve the JavaScript that performs the encryption. A compromised operator — or an attacker with control of our delivery pipeline — could serve modified code that exfiltrates passwords. This is the fundamental limitation of all browser-delivered cryptography, and it applies to every web-based encryption tool without exception.
If this is your adversary, use something else
A forgotten password
Not defended, by design. There is no recovery. If we could restore access, we could read your notes — the two capabilities are identical. Availability is deliberately traded away for confidentiality.
Physical or legal coercion of the password holder
Not defended. Nothing here helps if someone can compel *you* to reveal the password. There is no duress mode and no plausible-deniability construction.
Summary
| Adversary | Defended | Basis |
|---|---|---|
| Database breach | Yes | Server holds only ciphertext; no master key exists |
| Network interception | Yes | Plaintext never transmitted |
| The service operator | Yes | No key ever present on our infrastructure |
| Legal demand for content | Yes | Only ciphertext can be produced |
| Leaked share link alone | Yes | Link retrieves ciphertext; password is separate |
| Offline password guessing | Partial | 310,000-iteration KDF; bounded by password strength |
| Metadata observation | Partial | Slugs and request timing are visible to us |
| Malware on your device | No | Plaintext exists before encryption runs |
| The recipient copying it | No | Outside any technical boundary |
| Compromised code delivery | No | Inherent to browser-delivered cryptography |
| Forgotten password | No | Deliberate — recovery would mean we hold a key |
| Coercion of the password holder | No | No duress or deniability mechanism |
If your situation falls in the bottom half of that table, the honest answer is that Inkrypt is not the right tool, and we would rather tell you that here than have you find out later.
Frequently asked questions
Is Inkrypt safe for highly sensitive information?
What is the single biggest weakness?
Could Inkrypt be forced to serve me modified code?
Does encryption protect me from the person I share with?
How often is this threat model reviewed?
Related reading
Security architecture
Exact algorithms, parameters and stored fields.
Read moreZero-knowledge encryption
How to verify a provider-blind claim on any service.
Read morePassword protection
Why your password is the binding constraint on all of this.
Read moreResponsible disclosure
Found something we got wrong? Tell us.
Read moreThink we have the model wrong?
We would rather be corrected than be confidently mistaken. Our responsible disclosure policy explains how to reach the people who maintain this page.
Open the notepad