SSH keys that cannot be copied off the phone
The app can generate a key inside the phone's security chip. The private half is created there and never exists as bytes any process can read — including this app.
Why this matters
An imported private key is a file. However carefully an app encrypts it, it was plaintext at some point, it can be recovered from a rooted device, and it may sit in a backup you have forgotten about. A key that was never exportable has none of those exposures, because there is nothing to extract: signing happens inside the security hardware and only the signature comes out.
Where the key actually lives
Android offers two levels of protection and the app tells you which one you got, rather than claiming the stronger one:
- StrongBox
- A separate tamper-resistant chip — Titan M on Pixel devices, and equivalents from other manufacturers. Requested first.
- Trusted Execution Environment
- Hardware-isolated from Android and still non-exportable, but a softer boundary than a dedicated chip. Used when StrongBox is unavailable.
- Software only
- Some older devices and all emulators. The key still cannot be exported, but it carries no hardware guarantee — and the app says so in red rather than letting you assume otherwise.
What you give up
This is a real trade and the app states it before you generate anything. A hardware-backed key:
- cannot be backed up, including to the app's own encrypted cloud backup;
- cannot be moved to another phone;
- is lost if you uninstall the app or reset the device.
The recovery story is generating a new key and updating authorized_keys. There is no other option, so the app does not pretend there is. If you want a key that travels, put it on a YubiKey instead.
Optional biometric confirmation
A key can be created so that every signature requires your fingerprint or device credential. This prompts on each connection rather than caching an unlock for a window — a validity period would let one authentication cover later connections you never saw, which is not what "require confirmation" should mean.
Imported keys
Existing keys are supported and are never written to disk in plaintext. They are encrypted with AES-256-GCM using a key held in the Android Keystore, and excluded from Android's cloud backups. Passphrase-protected keys work; the passphrase is stored in the same vault.
A decrypt failure is treated as an error, not a fallback. Some clients quietly use the ciphertext as though it were the secret when unsealing fails, which produces baffling authentication errors months later. Here the credential is reported as unreadable instead.
Getting the public key onto your server
When a key is created, the app shows the authorized_keys line and offers to copy it. That is the only moment it matters: with no private key to export later, publishing the public half is the whole setup step. See Getting started.