Seal

Recover your key
from a backup file

This page never sends anything anywhere. It reads your file, unlocks it with your passphrase and shows the key — all inside this tab. Disconnect from the internet and it still works. Save this page so it keeps working even if Seal's site ever goes away.

1 · Your backup file
2 · Your passphrase
Your private key — shown once

Anyone who has this can move every coin in the wallet. Nobody is watching and nobody will ask for it later? Only then continue.

Address
Private key (base58, 64 bytes)
Import into other wallets
  1. Phantom — account menu → Add wallet → Import wallet → Private Key → paste.
  2. Solflare — account menu → Add account → Import account → Private key → paste.
  3. Backpack — account menu → Add wallet → Import → Private key → paste.

The imported wallet is a normal, exportable wallet — no approval popup, and the key sits in that wallet's own storage. That is exactly what makes it usable anywhere, and exactly what makes it drainable. Keep only what you'd accept losing there, or move everything into a fresh Seal wallet once you're done.

Keep this tool

Save it once and you never need this website again. It runs from a file on your own computer — with the internet switched off, and even if Seal's site one day stops existing.

How the backup file works (for developers)
Seal backup v1 - recover the private key without Seal.

1. Read the file as JSON. Fields you need: kdf.salt (base64, 16 bytes), kdf.iterations,
   cipher.iv (base64, 12 bytes), cipher.ciphertext (base64). Everything else is labels.
2. key = PBKDF2-HMAC-SHA256(password = passphrase as UTF-8, salt, iterations (600000), 32 bytes).
3. seed = AES-256-GCM decrypt with that key, that iv, and ciphertext. WebCrypto stores the 16-byte
   auth tag at the END of the ciphertext; other libraries want it split off (last 16 bytes) as the
   tag. A wrong passphrase fails that tag check - that is what "wrong passphrase" means here.
   The 32-byte result is the wallet's Ed25519 seed.
4. publicKey = Ed25519 public key for that seed. WebCrypto: import PKCS#8 bytes
   302e020100300506032b657004220420 + seed (48 bytes) as extractable, export JWK, base64url-decode "x".
   libsodium / Python: nacl.signing.SigningKey(seed).verify_key.
5. address = base58(publicKey), alphabet 123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz.
   It must equal the file's "address" field - if it doesn't, stop and don't use the key.
6. secretKey = base58(seed + publicKey), 64 bytes. That exact string is the standard Solana private
   key Phantom, Solflare and Backpack accept under "Import private key".

Anyone holding the seed or secretKey can move every coin in the wallet. Never paste it somewhere
that asked for it, and never type it into a website.