DevKits

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:

Comments

Signature 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