Spring Boot • PostgreSQL • Redis • AWS S3 • Ed25519 Auth
End-to-end encrypted file storage backend. The server stores only encrypted blobs and never has access to plaintext file content.
Every API on this page is live. Your demo account was auto-created when you loaded this page.
Initialising demo account…
Generating Ed25519 key pair
Session initialisation failed
IronHold is built around two architectural principles: files never pass through the application server, and the server is cryptographically blind to file content. The Spring Boot backend orchestrates metadata, access control, and presigned URL generation. S3 receives raw bytes directly from the client. Encryption happens in the client before bytes leave the device; the server handles only ciphertext.
Upload Flow
Sharing & Key-Wrapping Model
Click any endpoint to expand it. Authenticated endpoints automatically attach your demo JWT.
All requests go to https://your-deployed-url.com.
Authentication
Session Management
Upload Demo
Click to choose a file, or drag & drop
Max 5 MB for demo
Upload complete!
File ID:
File Operations
Folder Operations
| Name | MIME Type | Size | Status | Uploaded | Actions |
|---|
encryptedFileKey)When a client requests a file upload or download, Spring Boot generates a time-limited presigned URL via the AWS SDK. The URL embeds SigV4 credentials scoped to a single S3 operation. File bytes transfer directly between the client and S3. The Spring Boot server is not in the data path. Even a fully compromised application server cannot intercept file content in transit.
Authorization header.
AWS S3 only allows one auth mechanism per request; mixing presigned query params with an Authorization
header causes a "Only one auth mechanism allowed" error.
Files are encrypted client-side with a per-file AES-256-GCM key. When sharing, the sender wraps the
symmetric key with each recipient's Ed25519 public key and sends the wrapped key to the server as
encryptedFileKey. The server stores this opaque blob. Only the intended recipient, holding
the matching private key, can unwrap the symmetric key and decrypt the file.
No passwords are ever stored or transmitted. The client generates an Ed25519 key pair locally and registers the public key. To authenticate, the server issues a random nonce; the client signs it with the private key. The server verifies the signature and issues a JWT. The private key never leaves the client device.
At registration, IronHold generates eight one-time recovery codes and presents them to the user once.
Each code is immediately BCrypt-hashed (cost factor 10) and stored server-side. The plaintext is discarded.
If a user loses their Ed25519 private key, they can call POST /api/auth/recover with any unused
recovery code and a new public key. The server verifies the plaintext against the BCrypt hash, invalidates that
code, and issues a fresh JWT for the new key pair.
Recovery codes are single-use: once verified, the code is marked as used and can no longer be reused. The remaining codes stay valid. This mirrors the recovery code model used by TOTP-based 2FA. Store them offline in a password manager or print them and keep in a secure location.
8 codes generated per account · BCrypt-hashed (cost factor 10) · one-time use · plaintext never stored server-side