Security architecture
How LiteSig protects your Litecoin
This page explains exactly what LiteSig can and cannot do with your coins, how your keys are protected, and what the open-source crypto modules that power the app actually do.
The core guarantee
This isn't a policy claim. It's enforced at the code level: the server has a tripwire that rejects any API request whose payload contains known private key prefixes (xprv, Ltpv, tprv, ttpv). A bug that accidentally transmitted a private key would be blocked by the server before it persisted.
Key generation & derivation
All key material is derived in the browser using audited JavaScript cryptographic primitives. The derivation path follows Bitcoin Improvement Proposals that are also used by hardware wallets and other software wallets — your vault is not proprietary.
crypto.getRandomValues) are mapped to a 12-word BIP39 seed phrase. You write this down on paper — it is the master key to your wallet.
m/48'/2'/0'/2' for P2WSH on Litecoin). This produces an account-level extended public key (xpub/Ltub) that is safe to share with cosigners — it reveals public keys but not private keys.
Encryption at rest
Your wallet configuration (xpubs, derivation path, m/n, address index) and private key material are encrypted locally before anything is sent to the server.
Authenticated encryption — both confidentiality and integrity. Tampered ciphertext is detected and rejected.
Your passphrase is stretched with 200,000 iterations and a random 16-byte salt. Brute force is deliberately expensive.
All encryption uses the browser's built-in SubtleCrypto — no third-party crypto library handles your key derivation.
The server stores the resulting ciphertext. The passphrase is never sent. The plaintext is never stored.
PSBT signing flow
Spending from a multisig vault uses Partially Signed Bitcoin Transactions (PSBT), the same format used by hardware wallets and Electrum. The server coordinates but never signs.
At no point does the server hold a signing key, see plaintext transaction inputs, or have the ability to initiate or modify a transaction.
What the server sees
The LiteSig server is intentionally designed to be as blind as possible. Here is what it actually stores:
- Your email address — for login and notifications.
- A bcrypt hash of your password (cost factor 12) — the plaintext is never stored.
- Encrypted wallet blobs — AES-256-GCM ciphertext of your wallet configuration. The server cannot read it.
- Wallet metadata — network (mainnet/testnet), script type, m, n. These are not sensitive.
- PSBT blobs — base64-encoded PSBT data during the signing round. The server does not parse or inspect them.
- Stripe customer/subscription IDs — for billing. Payment details are held by Stripe, not LiteSig.
The server never stores: private keys, seed phrases, unencrypted wallet configurations, or transaction signing keys of any kind.
Account security
Your LiteSig account protects access to your encrypted blobs. Compromising your account gives an attacker the ciphertext — which is useless without your passphrase. That said, we take account security seriously:
A minimum 10-character password, stored as a bcrypt hash. Never logged, never transmitted back.
Optional but recommended. Compatible with any TOTP app (Authy, Google Authenticator, 1Password). The TOTP secret is encrypted at rest using AES-256-GCM.
15-minute access tokens stay in memory only. Refresh tokens are stored in httpOnly, Secure, SameSite=Strict cookies and rotate on every use.
All state-changing API calls require an X-Requested-With header and the refresh-token cookie enforces SameSite=Strict.
Auth endpoints are rate-limited to prevent credential stuffing and brute-force attempts.
Every API endpoint validates input with strict Zod schemas before touching the database.
Open-source crypto modules
The cryptographic core of LiteSig — everything that touches key material, address derivation, and transaction signing — is open source and independently auditable. The code is written in F# and compiled to JavaScript via Fable.
Crypto modules (open source)
- Crypto.fs SHA-256, RIPEMD-160, Hash160 — thin wrappers over @noble/hashes, an audited pure-JS crypto library.
- Bip32.fs BIP39 mnemonic generation & validation; BIP32 HD key derivation with Litecoin extended key versions (Ltub/Ltpv); BIP48 multisig account paths.
- Script.fs m-of-n multisig script construction with mandatory BIP67 public key sorting.
-
Address.fs
P2SH (
M…), P2WSH (ltc1…), P2SH-P2WSH, P2PKH, and P2WPKH address encoding for Litecoin mainnet and testnet. - Psbt.fs PSBT build, sign, combine, finalize, and extract via bitcoinjs-lib with Litecoin network parameters.
These modules have a test suite (Fable.Mocha) that cross-validates address construction against bitcoinjs-lib's independent implementation and exercises the full 2-of-3 sign → combine → finalize → extract flow.
Open standards & recovery
LiteSig does not use proprietary key formats. Every vault can be recovered using other standards-compliant wallets if LiteSig ceases to exist.
To recover a vault without LiteSig: import your BIP39 seed phrase into any BIP48-compatible wallet (Electrum-LTC with the right derivation path, or a hardware wallet that supports Litecoin multisig), re-enter your cosigners' xpubs, and reconstruct the same address. The funds are accessible.
Threat model & limits
We believe in being honest about what LiteSig does and doesn't protect against.
Protected against
- LiteSig server breach — an attacker who fully compromises our servers gets encrypted blobs and email addresses. They cannot move any funds without your passphrase.
- Single key loss or theft — the entire point of multisig. One compromised key is not enough to sign a transaction.
- Single device failure — your BIP39 backup restores your key; cosigners' keys are theirs independently.
- LiteSig disappearing — your vault is recoverable in any BIP48-compatible wallet using your seed phrase.
Not protected against
- Passphrase forgotten with no seed backup — there is no recovery path. Write down your seed phrase on paper and keep it somewhere safe.
- Compromised browser or device — if malware runs in your browser at the time of signing, it could intercept the decrypted key before it is used. Use an up-to-date browser on a trusted device.
- Coercion of m-of-n cosigners — if enough cosigners are forced to sign, funds can be moved. Choose cosigners you trust and whose keys are geographically or organizationally separated.
- LiteSig account compromise without 2FA — an attacker who logs in to your account can download your encrypted blob and attempt to brute-force your passphrase offline. Enable TOTP 2FA and use a strong, unique passphrase.