The Real Problem I Found
I started this weekend trying to build a command-line sync client (which may or may not even be possible), but I’ve stumbled onto what I think is a more important security issue.
We can’t actually verify Obsidian’s complete end-to-end encryption - only part of it.
What I Discovered
Following the E2E encryption verification docs, I can successfully verify WebSocket data encryption using the published scrypt parameters. Great!
But the /vault/access
API endpoint uses a completely different authentication method that’s undocumented. Same password, same salt, different hash entirely.
Why This Matters for Security
If part of the encryption chain is opaque, then the “verifiable encryption” promise isn’t complete. We can verify data encryption but not API authentication - leaving a gap where we have to trust rather than verify.
For true end-to-end verification, users should be able to independently audit every step of the authentication and encryption process.
The Security Questions This Raises
Without documentation, I can’t rule out concerning possibilities:
- Is the API using weaker parameters?
- Different algorithms?
- Password hashes instead of derived keys? (Probably not, but I can’t verify that)
I’m sure Obsidian is following best practices - they’ve done security audits and clearly understand encryption. But the opacity means users can’t verify it themselves.
What Should Happen
The E2E verification documentation should cover the complete authentication flow, not just data encryption. If Obsidian believes in verifiable encryption (which they clearly do), then every component should be verifiable.
Technical Details
# This works for WebSocket data verification
key = hashlib.scrypt(password.encode('utf-8'), salt.encode('utf-8'),
n=32768, r=8, p=1, dklen=32)
# But API authentication uses something completely different
TL;DR: Started building a sync client, found a gap in security verification that affects all users who want to audit Obsidian’s encryption claims.
Has anyone else noticed this discrepancy?