JWT Verifier — Validate JWT Signatures Online (HS / RS / PS / ES)
Paste a JWT and its signing key (HMAC secret, RSA/EC public key in PEM or JWK) to verify the signature and inspect claims. Supports HS256/384/512, RS256/384/512, PS256/384/512, ES256/384/512. Also flags exp / nbf / iat time-based claims. 100% local — nothing is sent to any server.
Last updated:
CommentsSignature verification runs entirely in your browser via the Web Crypto API. Supports HS/RS/PS/ES × 256/384/512. Need to generate a JWT? JWT Generator.
Frequently Asked Questions
What does this tool actually check?
Three things: (1) the signature is mathematically valid for the given key and algorithm, (2) the alg header matches a supported algorithm — including flagging the classic 'alg: none' vulnerability, (3) the standard time claims exp (expired?), nbf (not yet valid?), and iat (issued in the future?). Time checks are informational — an expired token still shows as signature-valid if the crypto is correct.
What key should I paste?
It depends on the algorithm in the JWT header. For HS256/384/512, paste the raw shared secret string used to sign it. For RS256/384/512 or PS256/384/512, paste the RSA public key in SPKI PEM (-----BEGIN PUBLIC KEY-----) or JWK format. For ES256/384/512, paste the EC public key (also SPKI PEM or JWK, with the right curve for the algorithm: ES256→P-256, ES384→P-384, ES512→P-521).
Why does verification fail even though I have the right key?
Common causes: (1) The key you pasted is the private key instead of the public key — this tool needs the public key for RS/PS/ES. (2) Curve mismatch — ES256 requires P-256 exactly, using a P-384 key gives an invalid signature. (3) The token was tampered with after signing. (4) Copy-paste added whitespace or missing BEGIN/END markers. Look at the specific error message; the Web Crypto API's messages are usually precise.
Is my key sent to any server?
No. Verification runs entirely in your browser via crypto.subtle.verify. You can confirm with DevTools Network panel — no request fires when you paste a token. That said, don't paste production secrets or private keys into any online tool you can't fully inspect — the source is available on GitHub if you want to audit.
Why is alg="none" flagged as invalid?
Historically, some JWT libraries accepted tokens with alg="none" (unsigned) as valid — an attacker could strip the signature and the server would trust the payload. RFC 7518 requires that unsigned tokens MUST NOT be accepted when signature verification is enabled. This tool always flags alg="none" as invalid regardless of the payload.
Related Tools
JWT Decoder
Decode JSON Web Tokens (JWT) to inspect the header, payload, and signature. Runs entirely in your browser — tokens are never sent to any server.
AES Encrypt / Decrypt
Encrypt and decrypt text with AES (128 / 192 / 256, GCM authenticated or CBC legacy) using a password. PBKDF2 key derivation with 200,000 iterations. 100% local — the Web Crypto API runs entirely in your browser.
RSA Key Generator
Generate RSA key pairs (2048, 3072, or 4096 bits) online for OAEP encryption, PSS signing, or RS256 JWTs. Exports PKCS#8 private key + SPKI public key as PEM, JWK, or DER (hex/base64). 100% local — the Web Crypto API runs in your browser, private keys never leave the tab.
Public Key Extractor
Paste an RSA or EC private key (PEM PKCS#8 or JWK) and instantly extract the matching public key in PEM (SPKI), JWK, or DER format. Perfect for publishing a JWKS endpoint, verifying a token against a private-key-only backup, or distributing a public key to peers. 100% local — the private key never leaves your browser.
RSA Encrypt / Decrypt
Encrypt text with an RSA public key or decrypt ciphertext with the private key, using RSA-OAEP (SHA-256/384/512). Accepts PEM (PKCS#8 / SPKI) or JWK. 100% local — keys and plaintext never leave your browser tab.
ECDSA Sign / Verify
Sign or verify messages with ECDSA (P-256, P-384, P-521) using PEM or JWK keys. Outputs both JOSE / P1363 (JWT-compatible) and DER (OpenSSL-compatible) signatures. 100% local via the Web Crypto API.