Security model
what the card protects, and what it does not.
The kit is non-custodial: keys stay on the user's phone (NFC Crypto) or exist only for a moment while signing (CryptoCard). The card is a physical second factor, not a hardware wallet. Tell your customers exactly that.
01Who holds the keys
| App | Where the keys are | What the card does |
|---|---|---|
| NFC Crypto | On the phone, in the system keychain (iOS Keychain, Android Keystore through flutter_secure_storage) | Opens the app and confirms signatures, when the user turns that on. Can carry a PIN-encrypted backup of the phrase. |
| CryptoCard Wallet | Only on the card, encrypted with the card's PIN. The phone keeps the public addresses (watch-only). | Is the wallet: tap + PIN opens the phrase in memory to sign, then it is dropped. |
| NFC Recovery | Nowhere. It reads a backup, shows the words, never stores them. | Holds the backup. |
| Card Studio | Nowhere. It never displays, logs or stores PINs or phrases. | — |
There is no server, no account and no analytics or crash reporting in the kit. You, the operator, never hold user funds or keys.
02NTAG215 and NTAG216 cards can be copied
Anyone who holds a card can read it and copy it to another card. That is exactly what Card Studio's Clone page does. The card link is a random identifier, not a secret key. A copied card works like the original in the app.
So the card stops someone who has the unlocked phone, or knows its passcode, but does not have the card. It does not stop someone who had the card in hand long enough to copy it. The card is not a hardware wallet: it does not sign anything itself.
Copy-proof cards (NTAG 424 DNA with signed one-time codes, or secure-element cards such as JavaCard) are the path to stronger protection. They are not implemented in this kit; the apps and the studio would need to be extended to issue and check them.
03The PIN protects the backup
- The backup on a card is the phrase's entropy encrypted with AES-256-GCM, under a key derived from the PIN with Argon2id (64 MiB, 4 passes).
- Anyone can read the encrypted bytes. Argon2id only makes each guess slow, about a second on a phone. A 6-digit PIN can fall to a determined attacker with the card within hours; 8 digits and more take far longer.
- That is why new PINs must be 8 to 12 digits and not trivial, wherever a PIN is set: NFC Crypto, CryptoCard Wallet and Card Studio. Encourage a different PIN per card; Card Studio's Clone can give each copy its own PIN.
- Wrong PINs slow down: NFC Recovery gives 3 free tries, then waits 5 s, 10 s, 20 s … up to 5 minutes. CryptoCard gives 3 free tries, then waits 30 s, 1 min, 5 min, 15 min, 1 h, 4 h. These delays are in the app; someone who copies the card can guess offline without them.
04Rules that live in the app
"Require the card", card roles and Spender limits are stored in the app's preferences on one phone (details). A rooted or jailbroken phone can change them, and another wallet app with the same recovery phrase ignores them. The 72-hour lost-card switch-off uses network time, so changing the phone clock does not skip it.
05Protections built in
- Every signer (EVM, Solana, Bitcoin, typed data, dApp messages) checks the card inside the signing code, not only in the screen that started it.
- Card writes are read back and compared; a write that must hit one specific card cannot touch another card.
- A hostile card cannot make the phone allocate large amounts of memory: the Argon2 cost read from a card is limited.
- NFC Recovery hides the words after 60 seconds and when the app goes to the background; copying is off and Android blocks screenshots. CryptoCard hides the phrase after 30 seconds and blocks screenshots on Android.
- CryptoCard keeps a broadcast that may or may not have reached the network and checks it again, so it is never signed twice.
- Card Studio's local API is bound to
127.0.0.1, checks theHostheader and needs a per-launch key.
06Your responsibilities as operator
- Describe the card honestly in your store listing and marketing: a second factor and a backup carrier, not a hardware wallet, and copyable.
- Tell users to keep their recovery phrase. A card can break or be lost.
- Use your own card domain and your own bundle IDs and signing keys.
- Replace the public RPC endpoints with your own providers before launch.
- Test your release build on real phones with real cards (checklist).
- Check the laws on wallets, cards and fees where you sell.
07Reporting a security issue
Report vulnerabilities in the kit privately through the support tab of the item page on CodeCanyon, with steps to reproduce. Please do not post them in public comments.