SSH Manager Pro

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:

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.