Verify Client-Side Encryption
Overview
This guide shows non-technical users how to verify that encryption truly happens client-side in your browser before files leave your computer. A zero-knowledge service encrypts your data in your browser, meaning the provider never sees plaintext—only encrypted ciphertext.
This verification takes about 15 minutes using only your browser's built-in tools.
Why This Matters
A service claiming "zero-knowledge encryption" means:
- Your files or secrets are encrypted in your browser before they leave your computer.
- The company never sees plaintext—only ciphertext (random data).
If encryption happens server-side, the provider could decrypt it. This guide teaches you how to see that encryption really occurs before upload.
What You Need
- Chrome, Edge, Brave, or Firefox (desktop version)
- A free or test account in UnoLock
- A small text file (e.g.,
test123.txt) containing obvious text like:Hello, this is my secret. - About 15 minutes
Step 1: Open Developer Tools
- Visit
https://safe.unolock.comand log into your vault. - Right-click anywhere on the page and select Inspect.
- In the DevTools panel, choose the Network tab.
- Enable "Preserve log" so traffic isn't cleared when pages change.
Step 2: Start Recording and Upload a File
- Ensure the Network tab is recording (red dot active).
- Upload your sample file to the vault (or create a note with the text).
- Wait until the upload finishes, then review the recorded requests.
You'll now see many requests in the Network list.
Step 3: Find the Upload Request
- In the search box above the request list, type
upload,file, orapi. - Click the request that looks like the file upload (often a
POSTorPUTrequest). - Select the Payload tab (in Firefox it may be labeled Request Body).
Step 4: Inspect What Was Sent
Look at the payload contents:
- ✅ Good: You see gibberish (long random text, base64 strings, or binary bytes like
JFk4s9ds/7x...)—this is ciphertext. - ❌ Bad: You can still read
Hello, this is my secret.—this is not encrypted client-side.
The contents should look like pure entropy: no words, no filenames, no JSON fields named "content".
Step 5: Check Filename and Metadata
Still in that request:
- Filename should be hashed (e.g.,
7e2a9d6f...) or absent entirely. - Headers may include
Content-Type: application/octet-streamorbinary/octet-stream—that's a good sign. - There should be no readable text in either the request URL or body.
Step 6: View Response Headers (Optional)
Select the Headers tab and confirm:
Request Method: POST
Status Code: 200
If the server only responds "OK" without echoing your plaintext back, that's good. If the server response body contains your text file contents, it's not zero-knowledge.
Step 7: Spot-Check with Another File
Repeat Steps 2–6 using a different file or secret. Ciphertext should change completely each time (due to encryption randomness). If it looks identical each time, that's a weak sign indicating non-random encryption.
Step 8: Entropy Test (Advanced, Optional)
- Copy a small chunk of the Payload data (around 1 KB).
- Paste it into an entropy calculator such as https://www.browserling.com/tools/entropy.
- A score above 7.5 bits/byte indicates strong randomness—typical of real ciphertext.
Step 9: Confirm No Plaintext Storage Locally
- In DevTools, go to the Application tab.
- Check Local Storage and IndexedDB.
- Make sure your secret text isn't stored there in clear. Zero-knowledge apps keep only random tokens, not actual content.
Step 10: Document What You Found
Create a simple record:
| Check | Result | Notes |
|---|---|---|
| Payload unreadable | ✅ / ❌ | |
| Filenames hidden | ✅ / ❌ | |
| No plaintext in local storage | ✅ / ❌ | |
| Randomness high | ✅ / ❌ |
Keep screenshots—they're useful evidence if you later audit or report results.
What "Good" Looks Like
- Upload request shows random bytes (ciphertext).
- No readable content anywhere in network tab.
- No plaintext remnants in local storage.
- Every upload looks different.
What "Bad" Looks Like
- Your text or filename appears in the upload payload.
- The server echoes your data back.
- Plaintext stored in browser storage.
- Identical ciphertext across uploads.
Optional Deeper Checks (For Technical Users)
- Use Fiddler, Burp Suite, or mitmproxy with your own test cert to intercept HTTPS locally (never do this with real secrets).
- Confirm ciphertext before TLS encryption is identical to what you saw in the browser.
- Compare with open-source zero-knowledge tools (Tresorit, Proton Drive) for baseline behavior.