Security Whitepaper

How PicVaultPro Protects Your Photos

A transparent, technical look at our encryption architecture. We believe you should understand exactly how your data is protected — not just trust marketing claims.

AES-256-GCMArgon2idRSA-OAEP 2048RFC 3394 Key WrapEncrypted on your device

The Core Principle

Encrypt before it leaves your device. Period.

Every photo and video you upload to PicVaultPro is encrypted in your browser using AES-256-GCM before it ever reaches our servers. Your encryption password never leaves your device. The contents of your photos and videos reach us only as ciphertext, and we cannot decrypt them.

This means that even in the worst-case scenario — a complete server breach — the contents of your photos and videos remain encrypted and computationally infeasible to decrypt without your password. Some information around them is handled in readable form so the product can work — file names, capture time and location from photo metadata, and the names you give vaults, albums, tags and people. See section 7 of our Privacy Policy for the full list.

Key Hierarchy

Four layers of keys, each protecting the next.

Layer 1

Your Password

Argon2id (memory-hard KDF)

Your encryption password is fed into Argon2id to derive a Key Encryption Key (KEK). Argon2id is the winner of the Password Hashing Competition and is resistant to GPU and ASIC attacks. On older browsers, we fall back to PBKDF2-SHA256 with 600,000 iterations.

Layer 2

Master Key

AES-256, wrapped with KEK

A random 256-bit Master Key is generated in your browser and wrapped (encrypted) using AES Key Wrap (RFC 3394) with the KEK. The wrapped master key is stored on our servers — but it’s useless without your password.

Layer 3

Vault Keys

AES-256, one per vault

Each vault gets its own random 256-bit Vault Key, wrapped by the Master Key. This means revoking vault access doesn’t require re-encrypting every file — you just revoke the vault key.

Layer 4

File Keys

AES-256-GCM, one per file

Each file gets its own random 256-bit File Key, used for AES-256-GCM encryption in 4 MB chunks. Chunk indexes are included as GCM Additional Authenticated Data (AAD), which means reordering chunks causes decryption to fail — detecting tampering before any plaintext is exposed.

Encryption Flow

🔑 Your Password→🔐 KEK→🗝️ Master Key→🏦 Vault Key→📄 File Key→🖼️ Your Photo

File Encryption Details

How individual files are encrypted and stored.

AlgorithmAES-256-GCM
Key Size256 bits (32 bytes)
IV Size12 bytes (96 bits)
Auth Tag128 bits (16 bytes)
Chunk Size4 MB (4,194,304 bytes)
AADChunk index (uint32 BE)
RNGcrypto.getRandomValues()
File FormatV3 (chunk-indexed AAD)

[0x03 version] [uint32 chunk_count]
[chunk 0: 12B IV | ciphertext | 16B auth_tag] ← AAD = uint32BE(0)
[chunk 1: 12B IV | ciphertext | 16B auth_tag] ← AAD = uint32BE(1)
[chunk N: ...]

Files larger than 4 MB are split into chunks, each independently encrypted with a unique IV. The chunk index is included as GCM Additional Authenticated Data, so reordering or removing chunks is cryptographically detected. This means even a compromised storage layer cannot tamper with your files without detection.

Encrypted Sharing

How vault keys are securely shared between partners.

When you share a vault with a partner, the Vault Key is encrypted with their RSA-OAEP 2048-bit public key and stored as a key grant. Your partner's browser then decrypts the vault key using their private key, giving them independent access to the same encrypted files.

1
You share
Vault key encrypted with partner's RSA public key
2
Key stored
Wrapped key stored on server (unusable without private key)
3
Partner decrypts
Partner's browser unwraps vault key with their RSA private key

Revoking access deletes the key grant. The partner can no longer unwrap the vault key, and all signed URLs expire immediately. No re-encryption of files is needed.

AI Processing & Privacy

How face recognition works without compromising encryption.

AI is off by default and completely optional. When enabled, your browser sends the plaintext photo directly to our dedicated AI server (Onyx) over HTTPS — before encrypting the file for storage. The AI server runs on infrastructure we own and operate.

🧠
Face Detection
RetinaFace neural network identifies faces in photos
📐
Face Embeddings
512-dimensional ArcFace vectors — not images, not reversible
🔐
Encrypted Storage
Embeddings encrypted at rest with AES-256-GCM
🗑️
Immediate Deletion
Plaintext photos are never stored on the AI server

Your photos never touch Google, Amazon, or OpenAI infrastructure. When you opt out, all embeddings are permanently and immediately deleted.

What We Can & Cannot See

Full transparency about data visibility.

We CANNOT see

  • Your photo and video contents
  • Thumbnail images
  • Your encryption password
  • Decrypted file keys

We CAN see

  • File metadata (names, sizes, dates)
  • EXIF location data
  • Vault names and structure
  • Share records and audit logs
  • Account profile and email
  • Face data, encrypted with a key we hold (opt-in)
  • Photo contents, only during opt-in face recognition (analyzed in memory on our servers)

We are transparent about this distinction. Metadata visibility enables features like date sorting, location grouping, and search without decrypting every file. Row Level Security (RLS) limits access to your own records at the database level.

Account Recovery

What happens if you lose your password.

During encryption setup, you receive a 24-word recovery key (BIP39 standard). This is a backup of your master key. If you forget your password, the recovery key is the only way to regain access.

There is no admin key, no escrow, and no backdoor. PicVaultPro holds no means of decrypting the contents of your photos and videos — not for ourselves, and not in response to a legal demand. That guarantee covers your media contents; it is not a claim about everything we store, and the readable metadata listed in section 7 of our Privacy Policy is the exception. The trade-off is deliberate: if you lose both your password and your recovery key, your data cannot be recovered by anyone, including us.

Infrastructure Security

How we harden the servers and network that protect your data.

Security Headers

Every page and API response includes a comprehensive set of security headers that instruct browsers to enforce strict protections.

Content-Security-Policy

Controls which scripts, styles, and resources can load

Strict-Transport-Security

Forces HTTPS with 2-year max-age + preload

X-Content-Type-Options

Prevents MIME-type sniffing attacks

X-Frame-Options

Blocks clickjacking by denying iframe embedding

Permissions-Policy

Disables camera, microphone, and geolocation APIs

Referrer-Policy

Limits referrer data sent to third parties

Cross-Origin-Opener-Policy

Prevents cross-origin window access attacks

Cross-Origin-Resource-Policy

Blocks cross-origin resource embedding

Automated Security Scanning

We run regular automated security scans using OWASP ZAP (Zed Attack Proxy), the world's most widely used web application security scanner. Our most recent baseline scan results:

0
Critical / High
59
Checks Passed
101
URLs Scanned

Responsible Disclosure

We maintain a public security.txt (RFC 9116) so security researchers know exactly how to report vulnerabilities. If you discover a security issue, please disclose it responsibly — we take every report seriously and respond promptly.

Questions about our security?

Read our FAQ for more details, or try it yourself.

Security Architecture | PicVaultPro — How We Protect Your Photos