← Back to How encryption works

🔐 Encryption technical details

The algorithms, key hierarchy and server-side data behind Pushany's end-to-end encryption. For an overview, see How encryption works.

Based on the implementation as of October 20, 2026.

Overview

Algorithms

PurposeAlgorithmSummary
Content encryptionAES-256-GCM12-byte IV, randomly generated for each encryption. The item and field are included in the AAD
Key derivationPBKDF2-HMAC-SHA256Derives keys from the recovery key and share link passwords. 16-byte random salt. 1,000,000 iterations for recovery keys you choose and share link passwords, 300,000 otherwise. Share link passwords must be at least 8 characters
Locked note PINPBKDF2-HMAC-SHA256 + HKDF-SHA256Derives a key from a value made from the PIN with 1,000,000 iterations, the protection key and a random value held by the server
SharingRSA-OAEP3072-bit, SHA-256. Hands list and note keys to invitees
Safety numbersSHA-256A 30-digit number derived from a public key, used to check that someone's public key hasn't changed
Agent writesRSA-OAEP + AES-256-GCMContent is encrypted with a new AES-256 key for each write, and that key is encrypted with your public key
Device approvalECDH P-256 + HKDF-SHA256Ephemeral key pairs on both devices produce the key that encrypts the keys being handed over. The 6-digit confirmation code is derived with SHA-256
Invite linksHKDF-SHA256Derives a key from 32 random bytes in the URL
PasskeysWebAuthn PRF + HKDF-SHA256Derives a key from the passkey's PRF output
Passkey sign-inWebAuthn (ES256, EdDSA, RS256)The server verifies the passkey's signature. The challenge is 32 random bytes and single-use (10 minutes)
Recovery keyRandom (120 bits)24 characters in Crockford base32

Key hierarchy

Recovery key (only on the device)
├─ PBKDF2 ─→ encryption key (first version)
│    ├─ your items, tags, files, contact nicknames
│    └─ keys of checklists you haven't shared
├─ PBKDF2 (separate salt) ─→ protection key
│    ├─ new versions of the encryption key
│    ├─ keys of shared lists and notes
│    ├─ key pair's private key
│    └─ safety numbers you've seen
└─ PBKDF2 (separate salt) ─→ locked notes key (in case you forget your PIN)

PIN + protection key + server's random value ─→ locked notes key
     └─ key of each locked note

Key pair's public key
     ├─ list and note keys given to invitees
     └─ items written by agents

List / note key
     └─ contents of checklists, shareable notes and locked notes
KeyHow it's made and stored
Recovery keyA 120-bit string created by the app, or one you choose (12+ characters). Never sent to the server
Encryption keyAES-256. The first version is derived from the recovery key, and new versions are random. Stored on the device. The server keeps it only encrypted with the recovery key or the protection key, plus a value for checking that a key is correct
Protection keyRandom AES-256. Stored on the device. The server keeps it encrypted with the recovery key
Key pairRSA-OAEP 3072, one per user. The server keeps the public key and the private key encrypted with the protection key
List / note keyRandom AES-256, one per checklist, shareable note and locked note. Stored encrypted for each person who uses it
Locked notes keyRandom AES-256, one per user. Kept in the device's memory only while unlocked. The server keeps it encrypted with a key derived from the PIN, the protection key and a random value held by the server, a copy encrypted with the recovery key, and a copy for each passkey with passkey unlock turned on, encrypted with a key derived from its PRF output
Invite link secret32 random bytes. Only in the part of the URL after #, which is never sent to the server
Share link keyRandom AES-256, or derived from a password. Only in the part of the URL after # (the password isn't included)
Approval keysEphemeral key pairs created on both devices for each approval
PasskeyDerived from the passkey's PRF output. Stores the encryption key and protection key encrypted. The value given to PRF is the same for every passkey (so whichever passkey is chosen at sign-in, it opens them in one step)

While you allow an agent to read your content, the server holds your encryption key (see When the server can decrypt).

Renewing the encryption key

Sharing

The contents of shared checklists and notes are encrypted with the list or note key. That key is given to each member encrypted with their own protection key or their public key, so the server can't decrypt it (for the exceptions, see When the server can decrypt and Scope and limitations).

Locked notes

Approving a new device

A device that has the keys (A) hands the encryption key and protection key to a device without them (B). The server only relays the values and can't decrypt the keys being handed over.

  1. When B asks for approval, your other devices with the app open show a confirmation screen with B's device name, device type, approximate location and the time.
  2. When you start approving on A, the two devices exchange ephemeral public keys and derive a 6-digit code from them. The code is shown only on B.
  3. You enter B's code on A, and A checks it on the device. If it matches, A encrypts the keys with a key derived through ECDH and sends them. If it doesn't, the request is deleted.
  4. B checks that the keys it received are correct before storing them. The approval is recorded in your notifications.

Passkeys

A passkey added in Settings signs you in and delivers your encryption keys in one step. Accounts are created with Google, GitHub or X.

What the server stores

Stored encrypted

Body, title, URL, tags, file names and types, file and attachment contents, list names, colors, icons, due dates and notes, section names, item text and notes, contact nicknames, safety numbers you've seen, tag definitions, and the text in note and list history.

Stored in plain text

The following isn't encrypted, because the server uses it for sorting, filtering, notifications and sharing.

ObjectStored in plain text
ItemsType (note, link, file, clipboard), format (Markdown, list), memo flag, created / updated / edited / pinned / bookmarked / trashed times, tray expiry, sticky note color, file size, sending and target devices, content flags (whether it contains text, links, images or videos), number and size of attachments, whether it's locked
Checklist itemsChecked time, position, flag, priority, section, due date and time, reminder settings, repeat, created and updated times
RemindersTime, repeat, time zone, notification language, target devices
SharingMembers, pending invitees, roles and @names; for history, the kind of action and who did it when
AgentsNames of lists chosen under "Lists shown by name" and of shared lists with "Show name to agents" on, the agent activity log (kind of action and target IDs), names of authorized agents
Account and devices@name, an ID per sign-in method, time zone, storage used, device names and types, last used times, API key names, passkey names and public keys, signature counts, whether passkeys sync, the encryption key version, the locked note PIN type and the number of wrong attempts in a row, the type and approximate location of a device asking for approval
Notifications (Web Push)Only the item ID and type are sent. The device fetches the content and decrypts it

For connection logs and other records, see the Privacy Policy.

The server and operator can't see
  • The content listed under "Stored encrypted"
  • Your recovery key
  • Your encryption key (except as below)
  • Your protection key, private key, and list and note keys (except as noted below)
  • Your locked note PIN and locked notes key
  • The part of invite and share link URLs after #
The server and operator can see
  • Everything under "Stored in plain text"
  • Ciphertext sizes, and when and how often you write
  • Who shares what with whom
  • The content described under "When the server can decrypt"

When the server can decrypt

What's stored on the device

Scope and limitations