Crypto wallets
Where wallet apps belong on this phone, which wallets suit which job, and how to install and verify them. Cold keys stay on separate hardware; the phone is for hot wallets, watch-only views and talking to signers.
Not financial advice. Compiled in October 2026 from public sources. Wallet versions and verdicts change weekly. Before you install or update anything that holds keys, look up that exact version on WalletScrutiny.
01Where wallets go on this phone
The phone has two spaces: the everyday profile, which always runs and gets notifications, and the protected space, which runs only while it is on screen and loses its key within seconds of you leaving. See Set up your phone for how they work.
| What | Where | Why |
|---|---|---|
| Hot wallet apps (Rabby, Unstoppable) | Protected space | The wallet's data is locked again when you leave. Nothing runs in the background, which is fine for a wallet. Push approvals and WalletConnect requests only arrive while it is open: open it first, then start the action. |
| Watch-only apps (Nunchuk watch-only, Safe watch view) | Either | They hold no spending keys. In the everyday profile they can notify you of incoming payments; in the protected space your balances stay out of view. |
| Companion apps for hardware signers (Trezor Suite, BitBoxApp) | Either, usually the protected space | The keys stay on the device. The app only shows balances and passes transactions to it. |
| Cold keys | Separate hardware | A hardware signer, or a second phone used only for signing. Never one of the two spaces. |
A profile is not an air gap. Both spaces share one kernel, one network stack and the same radios. They keep apps and data apart, which is enough to separate a hot wallet from a watch-only view. They don't make a cold wallet. "Air-gapped" QR signing between the two spaces of one phone doesn't work either: a phone's camera can't scan a code shown on its own screen. Use a hardware signer or a second phone.
The duress PIN wipes every wallet on the phone. Before you set one, make sure every seed held by a phone app is backed up off the phone and that you have tested a restore. The reboot PIN only restarts the phone and loses nothing.
On the phone
- Google Play: install it only in the space that needs it. Rabby needs it; Unstoppable, Nunchuk and Trezor Suite don't.
- Camera: grant it to the app scanning a QR code, "Only this time".
- No accessibility services, automation apps or screen overlays in the space that holds a wallet. Use a keyboard with the Network permission off.
- dApp links open in Vanadium, the GrapheneOS browser.
- USB-C "Charging-only when locked" (the default) still lets a Trezor or BitBox talk to the phone while it is unlocked.
- No cloud backup of the space holding a hot wallet. Never copy a seed to the clipboard.
02Four roles, four seeds
Four separate jobs, each with its own seed: a hot multi-chain wallet for dApps, Bitcoin cold storage, EVM cold storage with a Safe, and TRON for TRC-20 USDT. The picks favour audited, open or source-available code, an APK you can verify, and a path that doesn't depend on Google Play.
| Role | Primary | Second option | Signer hardware | Install from |
|---|---|---|---|---|
| Hot / dApps small balances, many accounts | Rabby Mobile (source-available, EVM) | Unstoppable (MIT, multi-chain incl. BTC and TRON) | None. Optionally a Ledger connected to Rabby. | Rabby: Google Play. Unstoppable: GitHub via Obtainium. |
| Bitcoin cold | Nunchuk as watch-only coordinator (2.9.0–2.9.3 reproducible) | Sparrow on a computer for setup and the descriptor | Single-sig: BitBox02 Bitcoin-only. 2-of-3: three makers, e.g. BitBox02 + Jade Plus + Trezor (Bitcoin-only firmware). | GitHub via Obtainium, certificate pinned |
| EVM cold ETH and L2s, many accounts | Safe 2-of-3 multisig | Rabby browser extension as signing front-end | Trezor Safe 5 + a second maker + a third key | Signing on a computer; the phone is watch-only |
| TRON / TRC-20 | Trezor Suite + Trezor Safe 3 or 5 over USB-C | TronLink + Ledger over Bluetooth. Hot float: Unstoppable. | Trezor, firmware 2.11.0 or later | Suite APK from GitHub releases |
Whatever you pick, the OS is part of the trust base: a compromised OS build defeats every choice on this page. That is one reason a separate signer phone should run stock GrapheneOS (section 11).
03Hot wallet
No single fully open wallet gives both many unrelated accounts and the widest dApp support, so the hot role is two apps, both in the protected space. Keep only amounts you could lose.
Rabby Mobile
- Why
- The best pre-sign simulation and risk warnings on mobile. Automatic chain switching. Works wherever a dApp offers "MetaMask" through WalletConnect, and with the Rabby extension on a computer for the same accounts. Several seeds, many accounts per seed. EVM only.
- Source
- RabbyHub/rabby-mobile is public but has no license file. Least Authority audited the mobile app itself in 2024 and 2025 (2025 report).
- Distribution
- Google Play only. No APK on GitHub, not on F-Droid or IzzyOnDroid, no WalletScrutiny entry.
- Hardware
- Ledger over Bluetooth. Other signers are reported but not confirmed on Android; test with a small amount.
- Weak spots
- 2022 swap-contract bug (repaid), a 2024 fake iOS app. Simulation calls DeBank's servers, so DeBank sees your addresses.
- Verdict
- Use it for dApps, with balances you could lose. Install Google Play in the protected space, then Rabby from Play.
Unstoppable Wallet
- Why
- Native, MIT-licensed, needs no Google Play. BTC, EVM chains, Solana, TON, Zcash and TRON in one app. Several wallets, BIP39 passphrases, custom RPC. The open counterweight to Rabby and the best hot wallet for small TRON amounts.
- Source
- unstoppable-wallet-android, v0.53.0 (26 Oct 2026).
- Reproducible
- WalletScrutiny reproduced 0.51.0–0.51.2 and 0.52.1. 0.52.0 and 0.53.0 failed to build from source ("ftbfs"), and 0.52.2 has mixed results. A failed build means unverified, not malicious.
- Distribution
- GitHub releases ship a
githubAPK and agoogle_playAPK. Use the github APK. TRON is in every build, but WalletConnect is only built in when its module is present, so F-Droid builds can ship without it. - Weak spots
- Narrower dApp support than Rabby. No hardware-wallet support.
Also considered
- Ambire: GPL-3.0, APK on GitHub. A smart-account wallet and a good open alternative to Rabby if you want to install from GitHub.
- MetaMask Mobile: the widest compatibility (EVM, Solana, BTC, TRON). Inspection-only license, not reproducible on WalletScrutiny, Play only, weaker signing warnings. Only if a dApp refuses everything else.
- Uniswap Wallet: GPL-3.0 (source), but Play only and EVM-centric. You don't need it to use Uniswap: open the site in Vanadium and connect Rabby with WalletConnect.
- Phantom: the usual Solana wallet. Closed app ("nosource" on WalletScrutiny; only SDKs are at github.com/phantom), Play only, and fake Phantom apps are a constant phishing theme. If you trade on Solana, give it its own seed and a small balance. Unstoppable covers plain SOL holding.
- Trust Wallet: closed app ("nosource"); only Wallet Core is open. A weak-RNG bug in its extension in 2023 and a backdoored extension release in late 2025. Skip it.
- Rainbow (GPL-3.0, Play only), Zerion (closed), Cake Wallet (rated custodial by WalletScrutiny because of its optional Lightning balance), Atomic and Guarda (closed).
"Unlinked accounts from one seed" are unlinked only until something links them. The wallet's backend and RPC provider see all your addresses together. A WalletConnect session shares every account you tick. Funding several accounts from one exchange withdrawal links them on-chain. For identities that must stay apart, use a different BIP39 passphrase (same words, different wallet) or a separate seed.
Connecting to dApps
- On the phone: open the site in Vanadium and choose WalletConnect; the link hands off to Rabby. Rabby's built-in browser also works for sites that expect MetaMask.
- On a computer: the Rabby extension with the same seed, or scan the site's WalletConnect QR code with Rabby Mobile or Unstoppable (github build).
- With a hardware signer: the Rabby extension on a computer supports Trezor, Ledger, Keystone, OneKey and GridPlus. That is the place for dApp signing with cold keys.
04Bitcoin cold storage
Recent incidents argue against trusting any one maker's seed generation or supply chain. For long-term holdings, use a 2-of-3 multisig across three makers. For single-sig, use one open-firmware signer with a dice-generated seed and a passphrase.
Nunchuk and Sparrow
- Nunchuk
- The strongest Android result in this survey: four consecutive releases (2.9.0–2.9.3) reproduced by WalletScrutiny. Native app with multisig, Miniscript and taproot, and PSBT over QR, NFC and USB. Guest mode needs no account. APK on GitHub. The free self-custody plan is enough; paid plans add a Nunchuk-held key, which is a different custody model.
- Sparrow
- Desktop app, Apache-2.0. Build the multisig here, back up the output descriptor, then import it into Nunchuk as watch-only.
- Server
- If you run a Bitcoin node, point both at your own Electrum server (Fulcrum or electrs). That closes off the malicious-server attack class described under incidents.
Signers
Firmware verdicts are WalletScrutiny's, October 2026.
| Device | Firmware | Link to the phone | Notes |
|---|---|---|---|
| BitBox02 Bitcoin-only / Nova | Apache-2.0, 9.27.1 reproducible | USB-C (Nova adds Bluetooth) | The cleanest stack without Play: BitBoxApp (Apache-2.0) is an APK on GitHub with official sideload instructions. Not officially tested on GrapheneOS, so test with a small amount. Best single-sig choice. |
| Blockstream Jade Plus | MIT, 1.0.41 reproducible | QR, USB-C, Bluetooth | No secure element; a blind PIN server stands in for one. A flaw disclosed in Dec 2025 (firmware 1.0.24–1.0.36, USB and Bluetooth only, not QR) was fixed in 1.0.37; 1.0.38 blocks downgrades to affected versions. Open and inexpensive. |
| Trezor Safe 5 (Bitcoin-only firmware) | GPL-3.0, 2.13.0 reproducible | USB-C | Secure element, SLIP-39 Shamir backups. No on-device dice entry. |
| Passport Prime + Envoy | GPL-3.0, 1.4.1 reproducible | QR, microSD (leave Bluetooth and NFC off) | A coherent Bitcoin-only pair. The Envoy app's current release doesn't build from source on WalletScrutiny. |
| SeedSigner (build it yourself) | MIT, 0.8.7 reproducible | QR only | Stores nothing between uses. The strongest air gap, from generic parts. |
| Coldcard Q / Mk4 | MIT + Commons Clause, 1.5.3Q reproducible | QR, NFC, microSD | Caution: 2026 weak-entropy bug. Usable as one key of three on fixed firmware with a new dice seed; not as your only key. |
| Ledger (any) | Closed | Bluetooth, USB | Not as a sole cold key: closed firmware, and an active 2026 tampering campaign through resellers. Fine as one key of a multisig. |
05EVM cold storage and Safe
For many separate EVM accounts holding real money: one Safe 2-of-3 per purpose (savings, DeFi positions), with owners on hardware from different makers. A Safe is deployed per chain: a mainnet Safe doesn't protect funds sent to the same address on Base or Arbitrum.
- Owner 1
- Trezor Safe 5: open, reproducible firmware (2.13.0), clear signing, USB-C. Many accounts and passphrase wallets for separation.
- Owner 2
- A different maker. Keystone 3 Pro signs over QR, decodes EIP-712 and Safe calldata, and its firmware 3.2.0 is reproducible. But Keystone found a breach on 20 Oct 2026 and said on 26 Oct that the attacker took buyer records and the WebAuth key behind its online genuineness check; it is destroying 18,835 unsold units that carry that key. Keystone says units delivered before 20 Oct 2026 are genuine and their check still holds. For a unit delivered on or after 20 Oct, or bought from a reseller, the check proves nothing: treat it as possibly counterfeit and ask Keystone support before use. Alternatives: a Ledger, a second Trezor, or a GridPlus Lattice1 (large screen, closed firmware, computer only).
- Owner 3
- A recovery owner: a seed on metal in a third place, or a signer app on a spare phone (section 11). Fine for simple transfers; weak at showing arbitrary calldata.
- Front-end
- Sign on a computer: the Rabby extension with the hardware signer, or a self-hosted Safe UI from safe-wallet-monorepo (GPL-3.0). On Android, Safe{Mobile} is Play only and supports only a Ledger over Bluetooth as a hardware signer. A Ledger owner can co-sign from the protected space; Trezor and Keystone owners sign on a computer.
The Bybit rule: the web page is not evidence. On the hardware screen,
check the chain, the Safe address, to, the value and the
operation. Refuse any delegatecall, addOwner,
removeOwner, changeThreshold, setFallbackHandler or
upgrade you didn't plan. Keep blind signing off. Treat EIP-7702 authorizations like
unlimited approvals.
06TRON and TRC-20
Trezor Suite and a Trezor Safe 3 or 5
- Why
- The only option here with open, reproducible firmware and native TRX and TRC-20 on the device. Trezor firmware 2.11.0 added TRON, TRC-20 and Stake 2.0 (changelog).
- Android
- The "Trezor Suite" APK is on the
trezor-suite GitHub releases (the
@mobiletags). Connects over USB-C. Its license is source-available (Trezor Reference Source License), not open source. - Limits
- Sending and receiving work on the phone. TRX staking needs the desktop app. Trezor Model One and TRC-10 tokens aren't supported.
- With a Ledger
- TronLink with a Ledger over Bluetooth is officially documented (TronLink guide). The Ledger TRON app is MIT; the device OS is closed. TronLink is Play only and needs Google Play in the same space.
- Hot
- Unstoppable for paying and receiving small amounts. TronLink only if you need TRON dApps, with its own seed; only its core module is open source.
- Alternatives
- Keystone 3 Pro through Keystone Nexus (Play only; subject to the breach note above). OneKey: good hardware, weaker vendor-trust story.
TRON traps
- Tether can freeze USDT on TRON. Self-custody doesn't stop a blacklist. Incoming tainted USDT can get exchange deposits frozen.
- Account permissions (owner and active) can hand control to someone else's key while your seed still "works". Never use a seed someone gave you. Check permissions on Tronscan before funding, and never sign a permission update you didn't start.
- New accounts need activation, and energy and bandwidth delegation are transactions too. Read them on the device.
- No fully open, reproducible TRON wallet matches TronLink's dApp coverage. Accept the gap rather than keeping savings in a closed app.
07A Ledger you already own
In October 2026 Ledger confirmed that units sold through a reseller carried a hidden implant that read the recovery words during setup. Check yours:
- Where was it bought? From CryptoBilis: treat it as compromised. From any other reseller, marketplace or airport shop: you can't rule it out, so treat it as suspect. Ledger says every confirmed case involves units sold through one reseller, and that its own direct sales are unaffected.
- The Genuine check in Ledger Live is not enough. The implant leaves the secure element intact, so tampered units pass. A pass only rules out a fake chip.
- Where did the seed come from? If the device arrived with a filled-in recovery card, a PIN already set or an opened seal, it is a scam device. The seed must have been generated on the device and never typed anywhere else.
- Look on-chain: check every address of that seed for unexpected outgoing transactions, approvals or TRON permission changes.
- If in any doubt, rotate. Generate a new seed on a device bought directly from its maker, move the funds, and retire the old seed everywhere.
If it checks out:
- Update the firmware in Ledger Live and confirm that Ledger Recover is not enabled.
- Turn blind signing off in the Ethereum app. Compare full addresses on the device screen.
- Turn Bluetooth off on the device when you don't need it. Ledger Live can also connect over a USB-C cable.
- Ledger's customer data has leaked before. Expect targeted phishing by email, text or post. Ledger never asks for the recovery words, and a "replacement" device in the post is always a trap.
- Best role: a warm signer for dApps through Rabby or TronLink over Bluetooth, or one owner of a Safe. Not the only key for long-term Bitcoin, because its firmware is closed.
08Installing and verifying wallets
For installing apps in general, see Install apps. For wallets, rank the channels by how much you have to trust someone other than the developer and yourself.
| Channel | Use for | Trust notes |
|---|---|---|
| Your own reproduced build | Nunchuk, Electrum, Unstoppable, AirGap Vault | Best when your build matches the developer's byte for byte. Then install theirs and keep their updates. See section 09. |
| Obtainium, from GitHub releases | Nunchuk, Unstoppable (github build), Trezor Suite, BitBoxApp, AirGap, BlueWallet, Envoy, Ambire, Electrum | Verify the first APK's signing certificate (below). Android then refuses updates signed by another key. Turn off third-party mirror sources. |
| Accrescent (from the App Store) | AppVerifier | Signed metadata, pinned keys, no account. None of the wallets above were confirmed there. |
| Direct APK from the developer's site | One-off installs (electrum.org, BitBox) | Check it with AppVerifier before installing. Updates need the same check again, so Obtainium is easier. |
| F-Droid | Only apps where F-Droid ships the developer's signature | A build re-signed by F-Droid can't take the developer's updates. IzzyOnDroid carries none of these wallets. |
| Sandboxed Google Play | Rabby, MetaMask, Phantom, TronLink, Safe{Mobile}, Keystone Nexus | Sandboxed, no special access. Install it only in the space that needs it. |
| adb from a computer | Your own builds | adb install --user <id> app.apk; adb shell pm list users lists the ids. Turn USB debugging off afterwards. |
| Aurora Store | Not for wallets | Adds a middleman and shared anonymous accounts. Sandboxed Play is safer. |
| APK mirrors, Telegram, "mod" sites, search ads | Never | Fake Rabby and TronLink APKs are a bigger risk than bugs in the real apps. |
Pin the signing certificate
Before the first install, read the certificate fingerprint on a computer:
apksigner verify --print-certs --verbose Nunchuk-2.9.3.apk | grep -i 'SHA-256'
# compare with the project's published fingerprint, the WalletScrutiny page,
# and AppVerifier on the phone (share the APK to AppVerifier)Write each fingerprint down once. From then on Android pins the key: an update signed by anyone else fails to install.
Obtainium checks the certificate before installing only from 1.6.16 (#2922), and only against a fingerprint you enter. Enter it when you add each wallet, and check the first install anyway:
- Verify Obtainium's own APK with
apksigneragainst the fingerprint on its releases page. - Install AppVerifier from Accrescent. Don't use it to verify Accrescent itself.
- For every new wallet, share the downloaded APK to AppVerifier before tapping install. Updates are then pinned by Android.
- Use GitHub, GitLab or Codeberg release assets only. Leave "allow insecure HTTP" off.
09Build and verify from source
There are two different goals.
- Reproduce (recommended): build the release tag in the project's Docker recipe and check that your build matches the developer's APK byte for byte. Then install the developer's APK and keep their updates. Your build is the proof; you never install it. Works today for Nunchuk and Electrum.
- Self-sign: sign your build with your own key and install it. The developer's updates then can't replace it without an uninstall, which deletes the wallet's data, so you rebuild every release yourself. Reasonable for MIT, GPL or Apache apps (Unstoppable, Nunchuk, BitBoxApp, AirGap). Not for MetaMask or Trezor Suite, whose licenses restrict it. Pointless for Rabby: no license, no reference build.
Reproduce everything that holds keys. Self-sign only if upstream releases stop reproducing.
- Get the tag, not the branch.
git checkout <release-tag>, thengit verify-tag <tag>where the project signs tags (Electrum, Sparrow and Trezor do). - Use the project's reproducible-build recipe exactly, on an x86-64
Linux machine with Docker:
For Unstoppable, F-Droid's build metadata doubles as a recipe.
# Nunchuk: see reproducible-builds/README.md in nunchuk-android git checkout android.<VERSION> docker build --platform linux/amd64 -t nunchuk-android -f reproducible-builds/Dockerfile . # then run the build step the README shows and compare with the split APKs from the phone # Electrum: see contrib/android/Readme.md ELECBUILD_COMMIT=HEAD ./contrib/android/build.sh qml all release-unsigned python3 contrib/android/apkdiff.py dist/<built>.apk Electrum-<ver>.apk # Any app WalletScrutiny covers: test.sh / testAAB.sh in its repository ./test.sh -a /path/upstream.apk ./testAAB.sh -d /path/split_apks_from_device/ - Compare with the release:
Differences should be in signature blocks only. Differences in
pipx install apksigcopier apksigcopier compare upstream.apk --unsigned rebuilt-unsigned.apk && echo REPRODUCIBLE # if not: diffoscope --html diff.html upstream.apk rebuilt-unsigned.apkclasses*.dex,lib/*.soor JavaScript bundles mean stop. - Audit dependencies of JavaScript and Flutter wallets: install with
--frozen-lockfile --ignore-scripts, runosv-scanneron the lockfile, and list packages with install scripts. For Gradle, check thatgradle/verification-metadata.xmlexists and is enforced. - Cross-check WalletScrutiny for the exact version and the exact APK you install (the GitHub build, not the Play one), not the app page. Verdicts are per build (how they work).
| App | Latest WalletScrutiny result | What to do |
|---|---|---|
| Nunchuk | 2.9.3 reproducible | Install from GitHub; reproduce one release yourself. |
| Electrum | 4.8.3 reproducible | 4.8.3 or later only, ideally with your own server. |
| Unstoppable | 0.53.0 doesn't build | Try reproducing it yourself, or self-build the github flavour. |
| AirGap Vault | 3.35.0 not reproducible | Stay on 3.34.4, or reproduce 3.35.x. |
| BlueWallet | 8.0.2 mixed | 8.0.0 reproduced; check before upgrading. |
| BitBoxApp | Not graded (companion app) | Verify the .asc signature of the GitHub APK. |
| Trezor Suite | Not graded (companion app) | Trust the device screen; the app only relays. |
| Rabby Mobile | No entry | Treat it as an unverified hot app. |
10Seeds and signing rules
- One seed per role, never mixed: hot, Bitcoin cold (three for a multisig), EVM cold, TRON.
- Generate cold seeds with dice, on the signer itself, using the device's own dice entry (at least 50 rolls of a fair die, unseen), or dice mixed with its random generator. Never convert rolls to words in an app or on a website. The 2026 Coldcard bug shows why.
- Back up on paper or metal, never photographed, never typed into an online device or a password manager. Add a BIP39 passphrase to cold seeds and store it separately. Rehearse a restore with a small amount: a wrong passphrase silently opens an empty wallet.
- Multisig beats Shamir for Bitcoin. Use SLIP-39 only on a Trezor, which implements it; never ad-hoc splitting tools. Keep the descriptor and the Safe owner list next to each key.
- Approvals: exact amounts, then revoke. Check them in Rabby's built-in
view; "revoke" sites are heavily phished. Watch for Permit, Permit2,
setApprovalForAlland EIP-7702 delegations. - Address poisoning: never pay to an address from your history. Compare the full address on the hardware screen with a saved contact. The first and last four characters are exactly what attackers imitate.
- WalletConnect: only hot accounts ever scan a dApp's QR code. Disconnect sessions after use.
- Vendor data leaks mean phishing that knows your name and order. No real vendor ever asks for a seed.
Never restore a cold seed into a phone app. A cold seed exists in two places only: inside the signer and on your backup. Typing it into Rabby, Unstoppable, MetaMask or any other app ("Import wallet") stores the keys on a networked phone, exposed to app bugs, malicious updates, the keyboard, the clipboard and backups. The hardware wallet then protects nothing, and deleting the app doesn't undo it.
To use cold funds from the phone, connect the signer instead: Rabby with a Ledger over Bluetooth, Trezor Suite with a Trezor over USB-C, Nunchuk with a Jade over QR, or a watch-only wallet built from the xpub or descriptor. The app builds the transaction; the device shows it and signs.
If you ever typed a cold seed into an app, even "just to check the balance", treat it as hot and move off it: make a new seed on a second signer (or after the old seed is safely backed up), check the new backup, send a small test amount, then move every account and passphrase wallet. Keep the old words until the old wallet is empty, then retire them. The same goes for a computer, a notes app or a photo.
11Spare phone as signer
A separate phone works well as the third key of a multisig or a backup signer, not as the main one: a phone has a far larger attack surface than a dedicated signer. Android's secure hardware can protect the wallet's encryption key, but the seed is still decrypted into ordinary app memory to sign.
Use stock GrapheneOS, signed by the GrapheneOS project, with the bootloader locked. A signer needs none of this OS's features, and stock GrapheneOS has less custom code and the upstream project's signing infrastructure behind it.
- A separate phone, not a space on your daily phone.
- No SIM or eSIM, Wi-Fi never set up, Bluetooth off.
- Copy the signer APK from a verified build on a USB stick, install it, and turn its Network permission off at the install prompt. Remove the stick.
- Then set the USB-C port to Off (Settings → Security & privacy → Exploit protection), before making any seed.
- Signer app: AirGap Vault (MIT; 3.34.4 reproducible, 3.35.0 not) for BTC and ETH, or BlueWallet in offline mode (MIT; 8.0.0 reproducible) for Bitcoin only.
- Generate the seed with dice. Export only the xpub or descriptor by QR. Check the first receive address on another signer before sending funds.
- Set auto-reboot to its minimum. Grant Camera only while scanning.
12Encrypting recovery notes
A recovery file holds what surrounds the keys: Bitcoin descriptors, Safe addresses and owners per chain, xpubs, certificate fingerprints, and instructions for whoever has to recover. Never seed words or passphrases: those stay on paper or metal.
- age (or rage) is the default: small, open format, several independent
implementations, scrypt for passphrases. Armored output (
-a) can be printed. - KeePassXC (with KeePassDX on Android, Network off) for many entries; pick KDBX4 with Argon2id in the database settings, and test opening it on every device you'd recover from.
- VeraCrypt for a container of many files; independently audited.
- Avoid ZIP, PDF and Office passwords and "locked" notes apps.
tar -czf - recovery/ | age -p -a -o recovery.tgz.age
# press Enter at the prompt and age generates a strong passphrase
age -d recovery.tgz.age | tar -tzf - # test without writing plaintext to diskOne file, several keys. age can encrypt to several recipients, and any one of them opens it: for example two hardware keys kept in different places and a paper identity. Losing one costs nothing.
age-keygen -o paper-identity.txt # print it, then delete the file
age -a -r age1…key1 -r age1…key2 -r age1…paper -o vault.age vault.tar- Three copies, two kinds of media, one off-site. Keep the passphrase apart from the file.
- Decrypt one copy once a year on a different machine.
- Decrypt to a pipe or an encrypted volume, not to synced or indexed folders.
An Apple encrypted disk image (DMG)? AES-256 is fine, but the key is derived with PBKDF2-HMAC-SHA1, which isn't memory-hard, so password-cracking tools attack DMGs on GPUs. The format is closed and only reliably opened on macOS. Acceptable as a convenience copy with a long random passphrase not saved in the Keychain; keep the master copy as an age or KeePassXC file.
13Recent incidents
Only incidents with a public source are listed. Dates are of the incident or its first public disclosure.
| Date | What | Reported by |
|---|---|---|
| 2025-02-21 | Bybit / Safe{Wallet} interface. A Safe developer machine was compromised and code injected into the hosted Safe web interface. Signers approved a delegatecall that replaced the Safe's implementation contract; about $1.5B lost. Hardware wallets didn't help signers who trusted the web page. | BleepingComputer |
| 2026-07-30 | Coldcard weak seeds. Since firmware 4.0.1 (2021), on-device seed generation used a weak software generator. Fixed in 4.2.0, 5.6.0 and 1.5.0Q, but seeds made before must be replaced. Seeds made with at least 50 private dice rolls were not affected. | Casa, Bitcoin Optech |
| 2026-10-12 | Tampered Ledgers. Units sold through a reseller carried an implant that read the recovery words during setup. Tampered units passed the Genuine check. | BleepingComputer, The Hacker News |
| 2026-10-24 | Electrum before 4.8.3. A malicious server could hide a broadcast and show a fake pending payment; a fee bump then signed the attacker's transaction. Exploited; fixed in 4.8.3. Other Bitcoin wallets that trust server history may share the problem. | Electrum advisory GHSA-6jp4-8v48-cc5v |
| 2026-10-26 | Keystone breach. Buyer records and the WebAuth key behind the online genuineness check were stolen (breach found 20 Oct). Keystone is destroying 18,835 old-key units. Seeds were not exposed. | Decrypt, The Hacker News |
14Sources
- WalletScrutiny and its verification spec
- GrapheneOS usage guide, GrapheneOS features
- AppVerifier
- Obtainium #2922 and 1.6.16
- Rabby Mobile source, Least Authority audit (2025)
- Unstoppable Wallet
- Uniswap Wallet source, Phantom on GitHub, Trust Wallet Core
- Nunchuk, Sparrow
- Safe wallet monorepo
- Trezor Suite, Trezor firmware changelog
- TronLink with Ledger
- AirGap Vault
- Electrum security advisories
- Coldcard vulnerability (Casa), Bitcoin Optech, 31 Jul 2026
- Ledger implant (BleepingComputer), Ledger implant (The Hacker News)
- Keystone breach (Decrypt), Keystone breach (The Hacker News)
- Bybit and Safe (BleepingComputer)