Backup security
Encryption
Use the bitcoin-backup package with a validated backup payload. encryptBackup(payload, password) and decryptBackup(ciphertext, password) are asynchronous. Do not pass a bare key into an API expecting a typed backup object or hand-build an encryption envelope.
The audited package uses AES-256-GCM and PBKDF2 with a default/recommended 600,000 iterations. Legacy recovery supports the earlier 100,000-iteration format. These are package-version details; retain format compatibility and do not lower the work factor to make an animation or login feel faster.
import { encryptBackup, decryptBackup } from "bitcoin-backup";
import type { DecryptedBackup } from "bitcoin-backup";
export async function encryptLocally(payload: DecryptedBackup, password: string) {
return encryptBackup(payload, password);
}
export async function decryptLocally(ciphertext: string, password: string) {
return decryptBackup(ciphertext, password);
}These functions belong in the user's local execution environment. Send only the encrypted result to the backup API. Keep backup passwords, WIFs, decrypted payloads, and phrases out of URLs, requests, logs, analytics, screenshots, and hidden HTML.
Stored data
The service stores ciphertext in PostgreSQL, along with ownership and update metadata. Recovery links are durable records with a cache; they are not an anonymous OAuth-ID lookup. Access controls and encryption are separate defenses. A stolen encrypted file can still be attacked offline, so password strength matters.
Do not promise that all information is encrypted from Sigma: account/session records, provider identifiers, public profiles, and other service metadata are readable by the service. There is no documented automatic ten-year deletion policy or instant erasure of every copied backup.
Passkeys and phrases
PRF-capable passkey enrollment can protect local backup unlock on supported devices. Ordinary passkey login alone does not supply a backup decryption key. Keep a portable recovery option before changing or removing credentials.
A seed phrase controls all profiles derived from that seed, even profiles absent from a recovered file. Phrase-only recovery lacks the full inventory. A backup password encrypts the file and is not a BIP-39 passphrase or a way to change the seed derivation.
Limits
Client-side encryption cannot protect secrets after malicious browser code reads them. JavaScript strings cannot be guaranteed to be securely erased from memory. Revocation and account deletion do not destroy copies already exported or published. See security model.