The short version
Everything runs in your browser
The server sends this site’s pages and scripts, and that is all it does. Encrypting, decrypting, editing and re-sealing happen in the tab you have open.
The page can’t send your data
Every page carries a security policy whose connect-src lists Google Analytics and nothing else. Your browser itself refuses to let the page contact any other server, this one included.
Nothing is kept
No accounts, no database, no logs. Text, passwords and files live in the tab’s memory and are gone when you close it. The only cookies are Google Analytics’.
One password, one try
Every action uses the password you type, and nothing else. There is no guessing, no “forgot password” and no recovery, for anyone.
You can check the first two yourself: open your browser’s developer tools, go to the Network tab, and use the site. After the page has loaded, the only requests are Google Analytics page-view hits, and none of them carries your text, passwords or files.
Sealing text
When you press Encrypt, three things happen, all in your browser:
-
1
Your password becomes a key. It goes through Argon2id with a fresh random salt. Argon2id is deliberately slow and memory-hungry: each attempt needs 64 MiB of memory and three passes over it. That takes a moment for you, and makes guessing billions of passwords impractically expensive for anyone else.
-
2
The key seals your text. AES-256-GCM encrypts it with a fresh random nonce. GCM also stamps it with a check value, so any change to the result is caught.
-
3
Everything needed to open it is written into one string. Everything except the password.
Anatomy of a sealed string
| Part | What it is |
|---|---|
nor1 | The format and its version. A future format would have a new name, and old strings keep opening. |
a2id.m65536.t3.p4 | The key settings: Argon2id, 65,536 KiB (64 MiB) of memory, 3 passes, 4 lanes. They travel with the string, so it opens even if the defaults change later. |
| salt | 16 random bytes. The same password makes a different key for every string, so nobody can precompute keys for common passwords. |
| nonce | 12 random bytes, never used twice with the same key. |
| ciphertext | Your text, encrypted, followed by GCM’s 16-byte check value. |
Why it behaves the way it does
- The same text gives a different string every time. The salt and nonce are new each time, which is intended: two strings never reveal that they hold the same text.
- Everything before the ciphertext is checked too. The settings, salt and nonce are part of what GCM verifies. Change any character anywhere and the string refuses to open.
- A wrong password and a damaged string look the same. Both fail the same check, and the page can’t tell which happened. The only message is “that password doesn’t open this text, or the text was changed”.
- Line breaks and spaces don’t matter. Chat apps and email often wrap long strings. Whitespace is ignored when you paste one back.
- An “é” typed two ways is the same password. Some keyboards produce “é” as one character, others as “e” plus an accent. The password is normalised (Unicode NFC) first, so both open the string.
- The string is only as strong as the password. Anyone can copy the string and try passwords against it on their own computer, as slowly as Argon2id forces them to. A long password, such as four or five random words, makes that hopeless.
Bitwarden exports
Bitwarden and Vaultwarden can export a vault as a file. This page works with Bitwarden’s own format, the one written by Bitwarden’s open-source code, so what comes out imports like any other export.
Which files open here
| Export type | Opens here? | Why |
|---|---|---|
| .json (Encrypted), password protected | Yes | You chose a password for the file when exporting, and that password opens it anywhere. |
| .json (Encrypted), account restricted | No | It is encrypted with your account’s own keys, not a file password. Only the account it came from can import it, so the page says so and explains how to export again with a password. |
| .json, not encrypted | Yes | There is nothing to unlock. It opens straight into the editor, and you can seal it with a password on the way out. |
| .csv | No | CSV has no room for cards, identities, custom field types or password history, so here it is only a download, never something to edit. |
Unlocking
The file itself tells the page how it was locked: a random salt and the key settings Bitwarden used, usually your account’s own. The page reads those, shows them to you, and then:
- 1Turns your export password into a key with the file’s own settings: PBKDF2-SHA256, or Argon2id for accounts that use it.
- 2Splits that key into two, one to decrypt with and one to check with (HKDF).
- 3Opens a small test block first. Bitwarden puts a random value in every export, sealed with the same keys, to tell a wrong password apart from a damaged file. If it doesn’t open, the password was wrong.
- 4Opens the vault itself. It is AES-256-CBC, protected by an HMAC-SHA256 check value, so a damaged or altered file is refused rather than half-read.
Your master password is never involved, and the page never asks for it.
Editing
- Logins, secure notes, cards, identities and SSH keys have forms. Anything else, including custom fields, passkeys, password history and item types from newer Bitwarden versions, can be edited in each item’s JSON view.
- Everything you don’t touch is left exactly as it was, down to the ids and dates.
- When you change a login’s password, the old one moves into that item’s password history, as it does when you change it in the Bitwarden app. The item’s revision date is updated too.
- Deleting only marks an item. It stays in the list with an Undo button until you seal the file, and Discard changes puts everything back.
- Before you continue, the page checks the file the way Bitwarden’s importer will: every item has a name and a type, folders exist, and so on.
Sealing again
- You choose a new export password. It only protects this file; your account’s master password doesn’t change.
- A new random salt is made, and the key settings default to the same as the original file. Your Bitwarden or Vaultwarden has already opened a file with those settings, so it will open this one.
- The new file has the same fields in the same order as a Bitwarden export.
- Before the download starts, the page opens the file it just made with your new password and compares it with what you edited. If they differ, nothing is downloaded.
Downloading without encryption
An unencrypted .json or .csv is available, folded away and behind a confirmation. These files hold every password in plain text, so any app or person with access to your Downloads folder can read them. Delete them when you’re done.
The CSV follows Bitwarden’s CSV layout, which only has columns for logins and secure notes. Cards, identities and other types are left out, and the page tells you how many. The JSON holds everything.
Importing into Vaultwarden
- Keep your original export. Until the new file has been imported and checked, it is your backup.
- Try a spare account first. Create an empty test account on your Vaultwarden, import the new file there and look through a few items.
- Import: in the web vault, open Tools, then Import data. Choose Bitwarden (json), pick the file, and enter the new export password when asked.
- Mind the duplicates. Importing adds items; it never updates or replaces existing ones. To swap your vault for the edited file, empty it first under Settings, My account, Purge vault, and only after you have checked the new file.
- Attachments are never part of an export. Upload them again afterwards.
What this can’t protect
Encryption in the browser protects your data on its way through the internet and on this server. It can’t protect it from things that already run on your side:
- Browser extensions. An extension allowed to “read and change data on all websites” can read this page too, including passwords as you type them. For a real vault, use a browser profile or window with no extensions.
- A compromised computer. Malware or a keylogger sees what you see.
- Files you download. Once a file is in your Downloads folder, protecting it is up to you, and more so for unencrypted ones.
- Weak passwords. A sealed string or export can be copied and attacked offline. Argon2id slows every guess down, but a short or common password will still fall.
- Trusting the page itself. Each visit loads the site’s code from this server, so you are trusting that it is the code described here. The code is small and served unminified (apart from the Argon2 library), so you can read it in your browser. In the Network tab you can also check that it sends nothing but analytics.
- Google Analytics. The page loads Google’s analytics script to count visits. Like an extension, any script on the page could in principle read it; this one is Google’s, and it only sends page views. If you would rather not run it, block it with a content blocker: everything here still works without it, and for a real vault use a private window with no extensions.
Cloudflare, which sits in front of every normake.com site, sees what any network in the middle sees: your IP address and which page you loaded. Google Analytics sees that you visited and which page. Neither sees text, passwords or files, because they never leave your browser.
Questions
- I forgot the password. Can you open it for me?
- No. Nobody can: the password is the only way in, and this site never had it. That is the point.
- Does it work offline?
- Once a page has loaded, yes. Encrypting, decrypting and editing need no connection, so you can load the page, disconnect, and carry on.
- Why does encrypting take a second?
- That is Argon2id doing its job. The same cost that you pay once, anyone guessing pays for every single guess.
- Can I open a sealed string without this site?
- Yes. The format uses standard building blocks (Argon2id and AES-256-GCM), laid out in the table above, so any program that implements both can open it.
- Is my Bitwarden master password ever needed?
- Never. The page only works with the password you gave the export file.
- How big a vault can it handle?
- Exports up to 50 MB, which is far more than a vault without attachments ever reaches.