jwt.io says Signature Verified even when key is not provided
Asked Answered
S

2

13

I signed a jwt in nodejs with the below snipet.

var jwtoken = jwt.sign({ email: '[email protected]', name: 'test' }, 'abcd');

I got the below token after signing

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJlbWFpbCI6InRlc3RAdGVzdC5jb20iLCJuYW1lIjoidGVzdCIsImlhdCI6MTYzNjE4MjYwOX0.07FXjm1lKEIiU_QOMEEOFzhsC0vtKt4PFoW-7YHHzyM

I wanted to verify this with jwt.io when I paste the JWT in jwt.io, I can see the the site says the "Signature Verified" for whatever key I provide(I dont need to provide abcd which is my actual key). I was expecting that the key would be required to determine if a signature is valid. How does the jwt.io determine if a jwt is valid without the original key.

Socratic answered 6/11, 2021 at 7:15 Comment(3)
It says "Invalid Signature" to mePandemonium
static.rcgroups.net/forums/attachments/2/6/7/7/4/4/…Pandemonium
@Pandemonium based on the question title Signature Verified even when key is not provided your statement is correct. When no secret is provided the result is 'invalid signature'. However, in the question the OP writes "Signature Verified" for whatever key I provide. That's the case covered in my answer.Alvardo
A
34

The https://jwt.io debugger works in both directions, you can inspect and verify tokens or create and sign tokens.

Esp. when you have a token signed with a symmetric algorithm (i.e. HS256, HS384, or HS512), you can easily get a false verification because there's only one key for signing and verifying the token.

When you first paste your token on the left side and then paste the secret or key into the field under 'verify signature' in the right column, the signature will be recreated and it might change if the secret is not the one that was used to create the original token. In this case, the result is always 'signature verified', because the signature was just calculated based on the entered secret.

The correct way to verify a signature is to first paste the key into the secret key field and then paste the token to the left part of the debugger. Always make sure, that any other content in the input fields is overwritten. If your key is actually Base64 encoded (i.e. a binary secret that is stored in Base64 encoded form), you should tell jwt.io by checking the "secret base64 encoded" checkbox.

enter image description here

Then the result, either 'signature' verified' or 'invalid signature', will be correct.

Every secret that you enter after that causes a recalculation of the signature and then it's always verified (with the new secret). Also clicking on the "secret bas64 encoded" checkbox causes recalculation. enter image description here

But if you do it in the right order, a wrong secret causes an "invalid signature" result:

enter image description here

Alvardo answered 6/11, 2021 at 7:39 Comment(2)
Amazing answer, not trivial at all.Breechcloth
So basically, if I already got the JWT and just wanna see it decoded to see what inside (I do not put anything in the Verify Signature part); then it will always said Signature Verified, as it already got that part in the token already ? Kinda misleading...Borak
C
0

While jps' answer is correct for symmetric keys (where the server and client both have the private key), if you're using asymmetric encryption (such as RSA, which is what SSL/TLS certs uses for HTTPS) and verifying the signature with the public key, jwt.io uses OIDC provider metadata to locate the public key. See a full description here: How does JWT.io already know my public key?

Colonial answered 30/3, 2023 at 16:10 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.