This specification applies to 1.0.1 and later versions that support .rta backups. The current Android download includes backup and restore.
Read a backup without the app
Download the offline reader Open the reader
- Save the HTML file, disconnect from the network, and open it in a current browser.
- Select your .rta backup and enter the vault password used when that file was exported. Password changes made later do not change old backups.
- Read account names and OTP parameters. Secrets stay hidden until you choose “Show secret”. You can manually bind a supported account in another authenticator using its secret and parameters.
- The reader does not generate codes, advance HOTP counters, or write an account library. It clears displayed data when hidden or closed. It does not export plaintext files.
Neither the reader nor another app can recover a forgotten backup password. Reading the file proves that it can be decrypted, not that every service will accept a login. Keep your original authenticator until you have checked your new setup.
v1 envelope
The file is one UTF-8 line containing ASCII only, with no BOM, newline or surrounding spaces:
rowstop-backup-v1:310000:<salt-hex>:<iv-hex>:<ciphertext-and-tag-hex>
- salt: 16 random bytes, encoded as 32 lowercase hexadecimal characters.
- IV: 12 random bytes, encoded as 24 lowercase hexadecimal characters.
- Derive a 32-byte key with PBKDF2-HMAC-SHA256, 310000 iterations, using the exact UTF-8 password. Do not trim or normalize it. Password length: 6–256 UTF-16 code units.
- Decrypt with AES-256-GCM, a 128-bit authentication tag appended to the ciphertext, and the UTF-8 AAD below. Verify authentication before reading JSON.
rowstop:backup:v1:pbkdf2-sha256:310000
Maximum file size: 2,097,300 bytes. Maximum decrypted UTF-8 payload: 1,048,576 bytes. Unknown versions, invalid fields, tampering and unsupported parameters are rejected as a whole.
Account document
{ "version": 1, "accounts": [ ... ] }
| Field | Meaning |
|---|---|
| id | Unique nonempty string, up to 256 characters; the app assigns new local IDs when merging. |
| type | totp or hotp |
| issuer / label | Service / account name, each up to 256 characters. The label must be nonblank. Colons and C0 / DEL control characters are not allowed. |
| alias / group | Optional display alias / single group, each up to 256 characters; no C0 / DEL controls. Missing, null or blank values mean no alias / Ungrouped. Newer readers trim surrounding whitespace. Older apps may ignore these fields. |
| secret | Validated, canonical uppercase Base32 secret. |
| algorithm | SHA1, SHA256 or SHA512 |
| digits | 6 or 8 |
| period | Integer seconds, 1–86400 |
| counter | Safe integer, 0–9007199254740991. Preserve it for HOTP; reading never increments it. |
Restore and portability
Passwords, device encryption keys, biometric credentials, permissions and pin preferences are not included. The app previews before merging, skips duplicate tokens, and preserves local names, aliases, groups and HOTP counters. New accounts retain the backed-up parameters. .rta is not a 2FAS or Aegis file; do not rename it and expect another app to import it.
To rebind manually, match the type, algorithm, digit count, period or counter as well as the secret. Support depends on the destination app and service. TOTP depends on device time. Check HOTP against the service because a backup may contain an older counter.
For help, email rowstop@yeah.net with the app version, device and reproduction steps. Do not send passwords, secrets, backups, migration QR codes or verification codes.