Security model
How MimiKey stores, syncs and authorizes the use of your data without the server ever seeing plaintext, and what it does and does not protect against.
Zero-knowledge principle
MimiKey separates having an account from being able to decrypt. Your account answers who you are, where your vaults live and which devices belong to you. The two secrets needed to decrypt anything — your master password and your Secret Key — exist only on your devices and are never sent to the server.
Three invariants follow, and every client (Mac, iOS, web) and the third-party authorization platform upholds them:
- Items are encrypted on your device before upload. The server only stores and relays ciphertext.
- Nothing the server stores — login verifiers, key wraps, token hashes — is sufficient to decrypt your items.
- A third-party app only ever receives a single result that you approved, one request at a time, inside MimiKey's own interface, sealed to that app's current authorization.
Important Zero knowledge protects you against an honest-but-breached server and against database leaks. It cannot protect a device that is already controlled by malware. See the threat model below.
What the server stores
| Category | Stored on the server | Notes |
|---|---|---|
| Account | Email, account status, SRP salt (16 bytes) and verifier | The verifier is computed from material derived with Argon2id from your master password and Secret Key; it cannot be reversed into your master password |
| Items | Item ID, revision, timestamps, encrypted envelope | Every field — title, URL, username, password, notes — is inside the ciphertext |
| Sync | A per-vault change log (ciphertext and revisions only) | Conflicts are returned as-is, never merged automatically |
| Devices | Device ID, name, public key, key version, revocation status | Revoking a device ends its sessions immediately |
| Sharing | Account identity public key, sealed identity private key, shared-vault key wraps, vault key fingerprints, member permissions | A wrap can only be opened with the recipient's identity private key |
| Third-party authorization | Client metadata, client_secret hash, authorization code and token hashes, per-grant approval and seal public keys, request metadata, sealed results and patches | Tokens, codes and secrets are stored only as SHA-256 hashes |
| Billing | Plans, orders, subscriptions | Unrelated to encrypted data |
What the server never stores
- Your master password, in any form (including hashes)
- Your Secret Key
- Your personal vault key, or any shared vault key in plaintext
- Item plaintext
- Your account identity private key in plaintext
- A third-party app's seal and approval private keys (they live only in that app's system keychain)
Note The server can still observe some metadata: how many items you have, ciphertext sizes, modification times, the timeline of devices and requests, and the hints a third-party app attaches to its requests (
reason,hint,prefill,fields). Those fields are plaintext, and integrators must never put credentials in them.
Two-secret key derivation (2SKD)
All of your account keys are derived from two secrets together:
- Master password — the passphrase you remember, 12–1024 bytes long.
- Secret Key — a 128-bit random key generated on your device at sign-up and displayed as
PM-followed by 26 Crockford Base32 characters. It is stored only on your devices and in your Emergency Kit.
Together with your account salt they go through Argon2id (64 MiB of memory, 3 iterations, 1 lane), domain-separated by purpose, producing three independent values:
| Value | Domain | Used for |
|---|---|---|
| Login material | password-manager/account-login/v1 | The password input to SRP; the server only receives a verifier computed from it |
| Vault key | password-manager/account-vault/v1 | Root key for items in your personal vault |
| Identity material | password-manager/account-identity/v1 | Seals your account identity private key, used for sharing and third-party update patches |
As a result:
- If the database leaks, an attacker must guess both your master password and a 128-bit Secret Key, paying the Argon2id cost for every guess. Offline brute force is not feasible.
- Your master password alone is not enough. A new device must enter the Secret Key on first sign-in.
- Account recovery requires your Secret Key. Without your Emergency Kit there is no recovery path; the server cannot compute one for you. If both your master password and Secret Key are lost, your data is unrecoverable by design.
The full list of parameters and domain strings is in Encryption.
SRP sign-in
Sign-in uses SRP-6a (RFC 5054 2048-bit group, SHA-256). The identity is your normalized (trimmed, lowercased) email address:
- The client sends an ephemeral public value
A; the server returns the salt and its ephemeral valueB. - Both sides compute a shared key. The client sends proof
M1; the server verifies it and returns proofM2, which the client verifies in turn. - On success the server issues an account session token (valid for 30 minutes).
Your master password, Secret Key and login material never cross the network; passively observing or replaying a handshake yields nothing usable. After sign-in, the client re-derives the vault key and identity material locally from the same two secrets and decrypts your items.
Important A leaked SRP verifier is still a target for offline guessing, at the cost set by 2SKD. The stronger OPAQUE protocol is on the roadmap and not yet implemented.
Devices and sharing identity
Device registration. Every device that signs in registers its public key with the server. You can revoke a device at any time from your device list: its sessions end immediately and further challenge sign-ins are refused. The last active device on an account cannot be revoked.
Account identity key. Each account has an X25519 identity key pair. The public key is stored openly; the private key is sealed with your identity material and stored on the server, so any client that completes SRP sign-in can unseal it locally. The identity fingerprint is the first 8 bytes of the public key's SHA-256, in hex, for manual comparison.
Shared vaults. Your personal vault key is derived by 2SKD and never distributed. A shared vault uses a random 32-byte key that is wrapped for each member individually with a sealed box addressed to that member's identity public key. The server stores only the wraps and a key fingerprint.
Removing a member. The owner's client first re-encrypts every item with a new random vault key, then distributes new wraps to the remaining members, and only then asks the server to remove the member. The removed member can no longer sync new ciphertext, but anything they already obtained or exported while they were a member can still be opened with the old key. That is an inherent limit of end-to-end encryption.
Local protections
| Protection | Mac | iOS | Web |
|---|---|---|---|
| Auto-lock | Clears in-memory keys after 5 minutes of inactivity | Locks after 5 minutes of inactivity | Releases in-memory keys after 5 minutes of inactivity |
| Clipboard | Copied natively; cleared after 30 seconds or on lock, only if the clipboard still holds what MimiKey copied | Expires after 30 seconds and is marked local-only (excluded from Universal Clipboard) | Written to the system clipboard; not cleared automatically |
| Biometric unlock | Touch ID: a non-exportable Secure Enclave key protects the derived material | Face ID / Touch ID: keychain item gated by biometrics | Not supported |
| Secret Key storage | App-local storage, cleared on sign-out | System keychain (this device only, never synced) | Browser local storage, cleared on sign-out |
Biometrics on iOS. Your master password is not stored on the device by default. Only when you explicitly turn on biometric unlock is it written to the keychain with biometryCurrentSet access control, which also requires a device passcode. Adding or removing a fingerprint or face invalidates the item automatically; you then unlock with your master password and turn biometrics on again.
Touch ID on Mac. When enabled, the Mac generates a non-exportable, biometry-gated key in the Secure Enclave and uses it to protect a random wrapping key, which in turn seals the three 2SKD outputs. The record file is readable only by you and contains neither your master password nor your Secret Key. The sealed data is bound to the server address and your account email, so it cannot be moved to another account, and it stops working after a master password change or account recovery.
Important Clipboard history, cloud clipboards, and copies that another process read before clearing cannot be recalled. Clipboard clearing is hygiene, not isolation.
Third-party authorization guarantees
Third-party apps integrate through the MimiKey SDK (see the developer overview). The platform guarantees the following to you:
- Decisions happen only inside MimiKey. Consent, picking, reading, creating and updating are all approved on cards rendered by MimiKey's own process. The third-party app may only show non-decision notices such as "Opening MimiKey…"; it cannot click buttons for you, overlay a fake card, or read what you enter.
- Only the item you approved. The app never sees your item list. Every result is a single item sealed to a seal key unique to that app installation and that authorization; the server sees only ciphertext.
- Plaintext for new and changed items bypasses the app. You type new passwords on MimiKey's own safety card. New values in an update are sealed by the SDK to your account identity public key, so only your unlocked device can open them.
- A stolen token is not enough. Every data call must carry an Ed25519 signature from that grant's approval private key, within ±300 seconds, with a single-use nonce. The approval key lives only in that app installation's system keychain.
- Callbacks carry no data. The URL that returns you to the app contains only
code,request_id,stateandstatus. Even if another app hijacks the custom URL scheme, it gets no ciphertext and no plaintext. - Revocation is immediate. You can revoke any grant from Third-party access in MimiKey, and the platform operator can disable an abusive integrator; all of its grants and tokens stop working at once.
Important Once you approve handing an item to an app, that app holds the plaintext. MimiKey cannot control what it does afterwards. Only authorize apps you trust.
Threat model summary
What MimiKey defends against
| Scenario | Defense |
|---|---|
| Server breach or database leak | Only ciphertext, verifiers and hashes; offline cracking requires both master password and Secret Key at Argon2id cost |
| Network eavesdropping or replay | TLS; SRP never transmits the password; third-party calls carry a timestamp, nonce and signature |
| Leaked third-party access token | Calls fail without the approval-key signature; access tokens expire after one hour |
| Stolen refresh token | Rotated on every use; replaying a rotated token immediately revokes the whole token family |
| Intercepted authorization code | Codes are single-use and valid for 10 minutes; public clients must use PKCE (S256) |
| Hijacked callback scheme | Callbacks carry no data; results can only be fetched and opened with that installation's private keys |
| Malicious or compromised third-party app | Cannot see other items; cannot forge approval cards; reads follow your per-grant policy |
| Lost device | Auto-lock; remote device revocation; keychain items are device-only and never synced |
What MimiKey does not defend against
- A compromised device. Malware, other processes running as your user, and administrator-level software can read memory, the Secret Key in local storage, keystrokes or the screen.
- A tampered web front end. If the server is compromised and serves malicious scripts, it can read the Secret Key from browser storage and capture your master password while you use the web app. For high-assurance use, prefer the native Mac and iOS apps.
- A weak master password combined with a leaked Secret Key. With both in an attacker's hands, only the strength of your master password remains.
- Forgetting both secrets. Your data is unrecoverable by design; there is no back door.
- Data already handed over. Results you approved for third-party apps, data a removed member obtained earlier, and clipboard history cannot be taken back.
- Metadata. The server sees item counts, sizes, timestamps and the hint text in third-party requests.
- A malicious server withholding or replaying old ciphertext. There is no anti-rollback ledger yet. The server cannot read or forge item contents, but it can deny service, hide items, or serve an older revision.
- Quantum computers. X25519 and Ed25519 are not post-quantum.
Audit status
MimiKey is in internal beta and has not yet undergone an independent third-party security audit.
What is in place today:
- The cryptographic core uses established open-source implementations (RustCrypto Argon2, XChaCha20-Poly1305, HKDF and SRP, plus curve25519-dalek and ed25519-dalek), and wipes keys from memory with
zeroize. - The Rust, Swift and JavaScript implementations are cross-checked against shared test vectors (see Encryption).
- Every critical server flow has end-to-end acceptance tests run against an isolated environment.
Until an independent audit is complete, we recommend that you do not keep the only copy of your most critical accounts — banking, primary email, Apple ID — in MimiKey. Outstanding work includes OPAQUE sign-in, an anti-rollback ledger, post-quantum key exchange, and the independent external audit.