Security
This page explains how Stillock protects your vault, first in plain terms and then in technical detail, and what it can't protect against. The app has the same explanation in Settings › About › How Stillock Works, with Simple and Technical views.
In plain terms
- Everything is encrypted before it's saved. Photos, videos, documents, notes and logins are encrypted on your device. So are their names, dates, thumbnails and folder names. Files on storage have random names.
- Your passcode stays on this device. It isn't stored or sent anywhere. Unlocking also needs a key held by your device's Secure Enclave, so someone who copies your files, even with a full copy of the device's storage, can't try passcodes on a computer. They have to guess on your device, where lockouts slow them down.
- Face ID or Touch ID unlocks with a key that only a biometric match can release. If the enrolled faces or fingerprints on your device change, Stillock turns Face ID off. It stays off until you unlock with your passcode and turn it back on in Settings › Security.
- Your recovery key is the backup way in. Stillock never stores it. If you lose both your passcode and your recovery key, nobody, including Odd Omens, can open your vault.
- iCloud only gets encrypted files. With iCloud Sync on, Apple stores files it can't open. Nothing derived from your passcode is uploaded.
- Stillock has no networking code. It has no accounts, analytics or servers. iCloud Sync is done by iOS.
- Private while you use it. Stillock locks when you leave it (or after the time you choose), covers its screen in the app switcher and while the screen is recorded or mirrored, and blocks third-party keyboards.
Lock options
These are set during setup and in Settings › Security. Changing them asks for your current passcode first.
| Option | Choices |
|---|---|
| Auto-Lock | Immediately (default), or after 1, 5, 10 or 15 minutes away from the app. Time away is measured so that changing the device's clock can't extend it. |
| Wrong Passcodes | Lock out after 3 wrong (default): 3 wrong tries lock Stillock for 5 minutes, the next 3 for 15 minutes, then 1 hour after every 3 more. Unlimited attempts has no waiting, so anyone holding your device can keep guessing. |
| Erase Data | Never (default), or erase this device's copy after 10, 15, 20 or 30 wrong attempts in a row. Only available with lockouts. |
Lockouts and the wrong-attempt count are kept in this device's keychain, so deleting and reinstalling Stillock or changing the date doesn't reset them. Restarting the device starts the current wait again. Unlocking with your passcode, Face ID or recovery key resets the count.
Wrong passcodes count wherever you enter them: on the lock screen, in AutoFill, and when Settings asks for your current passcode.
Erase after wrong passcodes
With an erase limit, Stillock permanently destroys the vault on this device when the limit is reached. It deletes this device's passcode and Face ID keys first, then the AutoFill copy and the vault's files on this device.
It only ever erases this device. With iCloud Sync on, it turns sync off on this device and leaves the copy in iCloud alone, so your other devices keep the vault. Someone holding one of your devices can't use wrong passcodes to destroy your others. You can set this device up again with Restore from iCloud and your recovery key.
WARNING
Erasing can't be undone on this device, and if the vault isn't in iCloud or a backup, your recovery key can't bring the data back. Anyone holding your device, including a child playing with it, can trigger it. With lockouts, reaching 10 wrong attempts takes at least 80 minutes.
If the limit is reached in AutoFill, the extension deletes its encrypted login copy and this device's unlock keys at once, and the app finishes erasing this device's copy the next time it opens. The iCloud copy isn't touched.
Erase Vault
Settings › Erase Vault erases on purpose. It asks for your passcode (or Face ID or Touch ID, when unlocking allows it) right before erasing. Wrong passcodes here count toward lockouts and the erase limit like anywhere else.
With iCloud Sync on, you choose:
- Erase on This iPhone Only (or iPad): erases this device's copy and keys and turns sync off here, as above. iCloud and your other devices keep the vault.
- Erase Everywhere (deletes the iCloud copy): also deletes the vault from iCloud, so every device that syncs it loses it. Only backup files you saved yourself would still have it.
Leaving the vault
Things leave the vault only when you choose:
- Save to Photos or Save to Files, which make unencrypted copies. See Save items to your device.
- Copying a username, password or website, which stays on the clipboard of this device for 60 seconds.
- AutoFill, which is off until you turn it on. While it's on, Stillock keeps an encrypted copy of your logins that only its AutoFill can open, and each fill hands a login to the app or website you fill it into. See AutoFill.
- Suggest Above Keyboard, if you turn it on, which gives iOS site names and usernames (never passwords).
- Back Up Vault, which saves an encrypted file. See Backups.
There's no share button, so items can't be sent straight into another app.
App Icon in Settings › Privacy lets you choose a Calculator, Journal, Weather, Clock or Tools icon to make Stillock less noticeable. Only the picture changes. The name under the icon still reads Stillock, and iOS shows a notice naming the app when you switch.
What Stillock can't protect against
- Someone using your device while Stillock is unlocked. Keep Auto-Lock on Immediately and lock Stillock when you hand your device to someone.
- A compromised or jailbroken device, or malware with Stillock's access. Such an attacker can get around the lockout counter and guess at the Secure Enclave's speed, about 0.7 seconds per guess. A 4-digit code falls in about 2 hours and a 6-digit code in about 8 days. A long passphrase resists this.
- Screenshots. iOS saves them unencrypted to Photos. Stillock can only remind you.
- Copies outside the vault: originals you leave in Photos (and in its Recently Deleted for 30 days), files left in Files, and copies you save out of Stillock.
- Dictation, which is an iOS feature and may be processed by Apple.
- Filled and copied passwords. The app or website you fill into receives the password, and a copied value can be pasted by any app you allow for 60 seconds.
- Suggest Above Keyboard. When it's on, iOS keeps site names and usernames (not passwords) in its own list on your device.
- What iCloud can see: how many files your vault has, their approximate sizes and when they change.
- Backup files. Anyone with a backup and its recovery key can open it. An old backup still contains items you've erased since.
- Losing both your passcode and your recovery key. The data can't be recovered by anyone.
- The strength rating for passwords is an estimate, not a guarantee.
Stillock's encryption hasn't been independently audited.
Technical details
All encryption uses Apple's CryptoKit. The source repository documents the full design, with ways to verify each claim, in SECURITY.md.
Keys
| Key | What it is | Where it's kept |
|---|---|---|
| Vault key | A random 256-bit key that wraps every item key | Only in memory while unlocked. Never stored unwrapped. |
| Item key | A random 256-bit key per item. Separate keys for content, thumbnail and Live Photo motion are derived from it with HKDF-SHA256. | Inside the item's metadata, which is sealed with the vault key |
| Passcode slot | The vault key wrapped (AES-256-GCM) with a key derived by HKDF-SHA256 from PBKDF2-HMAC-SHA256 of the passcode, a 256-bit random secret and an ECDH (P-256) agreement with a Secure Enclave key | This device's keychain, WhenUnlockedThisDeviceOnly. Never synced or included in backups. |
| Recovery key | 160 random bits, shown as 32 characters | Only where you write it down. Never stored by Stillock. |
| Recovery slot | The vault key wrapped with HKDF-SHA256(recovery key) | In vault.json beside the vault, so also in iCloud Drive when syncing, and in backups |
| Face ID slot | The vault key wrapped via ECDH with a Secure Enclave key that requires a biometric match (.biometryCurrentSet) | This device's keychain, device-only |
PBKDF2 rounds are calibrated on your device at setup to take about 0.7 seconds, with a minimum of 650,000. Because the passcode key also needs the Secure Enclave, each guess has to run on your device.
Face ID unlock is biometrics only, with no fallback to the device passcode. Enrolling a new face or fingerprint invalidates the key.
"New Recovery Key" re-wraps the same vault key with a new recovery key. An old copy of vault.json, for example in an old backup, still accepts the old recovery key. If you think a recovery key was exposed, erase the vault and create a new one.
Files
- Content uses AES-256-GCM in 512 KiB chunks. Each chunk has its own nonce (a random 64-bit prefix and the chunk number), and the file header, including the total length, is authenticated with every chunk, so reordering, truncation and tampering are detected.
- Metadata, thumbnails and folders are sealed with AES-256-GCM. File names on storage are random UUIDs.
- The local vault is in the app's Application Support folder with complete file protection, and is excluded from device backups.
vault.jsonis not encrypted. It holds the vault ID, a salt, the creation date and the recovery-wrapped vault key, and nothing derived from your passcode.
While you use it
- On lock, the vault key, decrypted caches and the temporary decrypted folder are dropped.
- Videos play through an in-memory decrypting loader. PDFs and text are shown from memory. Other documents need a temporary decrypted copy for Quick Look, kept with complete file protection and deleted when the viewer closes or Stillock locks.
- Duplicate detection uses a SHA-256 hash of each imported file, stored in the item's encrypted metadata.
- Password Health decrypts passwords only for the check and keeps only item IDs.
- Generated passwords use the system's secure random number generator, without modulo bias.
AutoFill
AutoFill is off by default, and nothing is written for it until you turn it on. While it's on and Stillock is unlocked, the app writes the logins to the App Group container shared with the AutoFill extension, sealed with AES-256-GCM under HKDF(vault key, safeguard.autofill.v1). The extension unlocks with the same passcode slot and Face ID key, kept in a keychain group shared only by the app and the extension, and enforces the same lockouts and erase limit. Decrypted logins exist only in the extension's memory while its sheet is open. Turning AutoFill off, hiding Passwords or erasing the vault deletes the copy.