Product · Aloaha Web Wallet

An EU-Wallet holder that lives in your browser.

A hosted, browser-based EU Digital Identity Wallet holder for the many Europeans who cannot or will not install a native app: older users, corporate devices without app-install rights, phones already at storage capacity, or people who simply prefer opening a URL. Runs as a Progressive Web App on desktop and mobile, uses WebCrypto for all key operations, backs up an end-to-end encrypted vault to our OIDC server so you can recover on a new device.

Open the Web Wallet → How to sign in with it →
What this is, and what it isn't. This is a browser-based holder implementing OID4VP 1.0 FINAL + OID4VCI + HAIP + SD-JWT VC, with hardware-backed WebAuthn passkeys as a recovery factor. It maxes out at Level of Assurance Substantial, not High. It is not the EUDI Wallet Instance (that is the government-notified native app on your Member State's roadmap). It is a companion holder for use cases where a browser reaches your audience and the LoA-Substantial claim ceiling is fit-for-purpose.

Why a browser wallet at all?

Reach every user

App-install friction is the biggest single reason EU-Wallet uptake will stall. A browser holder reaches the users who never install anything. Same standards, same claims, no store review.

Corporate desktops

Fleet-managed corporate laptops rarely permit app installs. A browser wallet works within the existing browser sandbox and passes standard IT policy.

Instant onboarding

Verifier flow can bootstrap a wallet in the same tab: user has no wallet → click the "Sign in with EU Wallet" button → wallet UI opens → they finish the flow. No app-store detour.

Cross-device by design

Sign in on a new laptop, restore the vault via passkey or passphrase, all your credentials are back. Zero-knowledge backup means Aloaha holds only ciphertext.

How you sign in

The wallet is gated by our own OIDC provider — the same sign-in that protects every other admin surface. There is no separate "wallet account"; there is one identity per tenant. When you open /web-wallet.html you are prompted to sign in (WebAuthn, TOTP, or password, per tenant policy) and every request the wallet makes to /wallet-backup.ashx carries an OIDC bearer token.

Two layers, each doing its own job. Authentication (OIDC, "who are you") gets you access to the encrypted vault blob. Vault decryption (passphrase or WebAuthn passkey PRF, "what unlocks your credentials") is independent of authentication and never leaves your browser. Zero-knowledge is preserved: the server knows who you are but still cannot decrypt your credentials.

Multi-factor recovery (from day one)

Losing your device shouldn't mean losing your credentials. The wallet stores an end-to-end encrypted vault that can be unlocked by any single registered recovery factor.

Factor 1 — Recovery passphrase (mandatory)

PBKDF2-SHA256 with 600 000 iterations (OWASP 2023) derives a key-encryption-key from your passphrase. The passphrase never leaves your browser. Write it down — it is the cold-storage fallback for the worst case.

Factor 2 — WebAuthn passkey (recommended)

Register a passkey with the WebAuthn PRF extension. The PRF derives a deterministic key-encryption-key per authenticator. On modern browsers (Chrome, Edge, Safari 17+, Firefox 122+) the passkey syncs via iCloud Keychain / Google Password Manager / Windows Hello, so a new device recovers your wallet with just the passkey ceremony — no passphrase entry needed.

Factor 3 — Multi-device passkeys (belt-and-braces)

Register additional passkeys on other browsers or devices. Each factor wraps its own copy of the vault's data-encryption-key. Add, remove, or replace factors at any time without re-encrypting the vault.

Zero-knowledge server backup

The wallet syncs its encrypted vault blob to your tenant's /wallet-backup.ashx endpoint (OIDC-bearer gated). Our server stores ciphertext only. We literally cannot decrypt your vault, use your keys, or help you if you lose every recovery factor. That is by design (zero-knowledge) and stated plainly in the setup wizard.

Envelope encryption: a random 256-bit data-encryption-key (DEK) encrypts your credentials with AES-256-GCM. The DEK is wrapped once per registered factor using AES-KW (RFC 3394). Passphrase factor: DEK wrapped under PBKDF2-derived key. Passkey factor: DEK wrapped under an HKDF-SHA256 derivation of the WebAuthn PRF output. Any surviving factor unwraps the DEK and decrypts the vault.

Supply-chain resilience: Aloaha-owned code

The entire EUDI protocol layer — SD-JWT VC parsing, KB-JWT signing, OID4VP presentation, OID4VCI credential import, wallet attestation, WebAuthn PRF integration, envelope encryption — is written line-by-line by Aloaha Limited on Malta. Zero eudi-lib-* dependencies in the tree. Zero third-party JavaScript in the wallet client. Generic infrastructure libraries used elsewhere in the platform are well-established open-source components; the EUDI protocol layer is 100% ours. Auditable line-by-line by your CISO.

Standards + interoperability

OID4VP 1.0 FINAL

HAIP profile including x509_hash / x509_san_dns client identifier prefixes (HAIP §5.9.3) and JWE ECDH-ES A128GCM envelopes.

OID4VCI

Pre-authorized_code flow with dynamic vct resolution and holder-binding via cnf.jwk.

SD-JWT VC

Draft 07-compliant parsing + selective disclosure + KB-JWT with sd_hash.

WebAuthn Level 3 PRF

Passkey-based key derivation per draft-ietf-webauthn-prf.

WebCrypto only

All crypto via window.crypto.subtle. Non-extractable keys where possible. No JavaScript polyfills.

Same-origin CSP

Wallet page enforces strict CSP so no third-party script can exfiltrate the vault DEK during its brief in-memory window.

How it fits alongside the native EUDI Wallet

When the government-notified EUDI Wallet Instance for a Member State ships, users who want LoA-High and hardware-anchored PID belong there. This browser holder complements it, not competes with it. Use it for the audience the native app doesn't reach: older users, corporate desktops, first-touch onboarding, sector-specific credentials where LoA-Substantial is fit-for-purpose, or as a fallback when the native app isn't installed yet.

Read next