Educational demo. Not a production issuer/verifier. All examples synthetic. Generates W3C VC 2.0 credentials in your browser using the Web Crypto API and the did:web identifier method. No data leaves the page.
A DID is a globally unique identifier that does not require a centralized registration authority. The W3C DID Core 1.0 Specification defines a generic format: did:<method>:<method-specific-id>.
Each DID resolves to a DID Document — a JSON object that lists the public keys and service endpoints associated with the identifier. The method part of the DID determines how resolution happens.
The did:web method resolves a DID by fetching a JSON document over HTTPS. did:web:issuer.example.com resolves to https://issuer.example.com/.well-known/did.json. It uses infrastructure organizations already operate (DNS + TLS + a web server) instead of requiring a blockchain or distributed ledger.
| Method | Anchor | Cost | Honest tradeoff |
|---|---|---|---|
| did:web | DNS + HTTPS | Free (you already pay for the domain) | Trust collapses to whoever controls the domain & cert. Not "decentralized" in the Web3 sense. Easy to deploy, easy to seize. |
| did:key | The public key itself | Free | Self-contained, no resolution network needed. Cannot rotate keys without changing the DID. Good for ephemeral subjects. |
| did:ion | Bitcoin (Sidetree) | Bitcoin tx fees, complex node ops | Censorship-resistant, but resolution requires running a Sidetree node or trusting one. Microsoft scaled back operational support in 2024. |
| did:ethr | Ethereum | Gas to register/update | Decentralized in the ledger sense; depends on Ethereum's continued operation and gas economics. Public ledger means analytics on identity activity. |
| did:plc | Bluesky's central directory | Free | Used by ATProto/Bluesky. Despite being called decentralized, the directory is operated by one company. Honest about the centralization. |
did:web:issuer.example.com.https://issuer.example.com/.well-known/did.json (path-style: did:web:issuer.example.com:users:alice → https://issuer.example.com/users/alice/did.json).GETs that JSON. The DID document lists public keys.proof.verificationMethod and checks the signature.example.com's DNS is hijacked, the cert is mis-issued, or the registrar suspends the domain, the DID fails (or gets silently replaced). did:web buys you DID-spec compatibility and credential portability; it does not buy you censorship resistance. For a security-engineering audience that's fine — just don't oversell it.A Verifiable Credential (W3C VC Data Model 2.0) is a tamper-evident JSON-LD document that an issuer signs about a subject. The minimal shape:
@context — JSON-LD vocabularies (always includes https://www.w3.org/ns/credentials/v2)type — array starting with VerifiableCredentialissuer — the issuer's DIDvalidFrom / validUntil — ISO 8601 timestamps (VC 2.0 renamed issuanceDate/expirationDate)credentialSubject — the claims about the holderproof — cryptographic signature (Data Integrity, JWS, etc.)| Demo does | Demo does NOT do |
|---|---|
|
|
Pick a key type and a domain. The browser generates a real keypair via crypto.subtle.generateKey(), exports the public half to JWK, and embeds it in a sample did.json document. The private key stays in memory only for this tab session.
In production you would host this exact JSON at the URL above. Here it stays in memory.
crypto.subtle is supported in Chrome 113+, Firefox 130+ and Safari 17+. Older browsers will fall back to RSA-2048 automatically with a status message.Build a W3C VC 2.0 credential and sign it with the keypair generated in the DID Document tab. Signing uses compact JWS (header.payload.signature base64url-encoded). The header's kid points back to the issuer's verification method.
Key/value pairs that go inside credentialSubject.
Paste a signed VC produced by the Issue tab (or from another instance of this page). The verifier checks the JWS signature against the public key currently loaded in the DID Document tab, then inspects the credential structure.
proof.jws fieldproof block)crypto.subtle.verify() using the in-memory public keyvalidFrom ≤ now ≤ validUntilissuer matches the DID Document's id@context URI resolvesA Verifiable Presentation (VP) is a wrapper a holder builds to share one or more credentials with a verifier. It can be signed by the holder (proving possession of the subject DID) and embed the issuer-signed VCs verbatim. This tab demonstrates the bundling pattern.
Use Add to portfolio on the Issue tab to add credentials, or paste raw VC JSON below.