ðŸŽŦ
← āļāļĨāļąāļšāđ„āļ›āļ„āļđāđˆāļĄāļ·āļ­

āļ§āļīāļ˜āļĩāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™ JWT: HS256, RS256 āđāļĨāļ° ES256

· āđāļ—āđ‡āļ: jwt-verification, jwt-signature, hs256, rs256, token-validation

āļ§āļīāļ˜āļĩāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™ JWT

JWT āļ™āļģāļžāļē claims āđƒāļ™āļĢāļđāļ›āđāļšāļšāļ‚āđ‰āļ­āļ„āļ§āļēāļĄāļ˜āļĢāļĢāļĄāļ”āļē āļŠāļīāđˆāļ‡āđ€āļ”āļĩāļĒāļ§āļ—āļĩāđˆāļ›āđ‰āļ­āļ‡āļāļąāļ™āļāļēāļĢāļ›āļĨāļ­āļĄāđāļ›āļĨāļ‡āļ„āļ·āļ­āļĨāļēāļĒāđ€āļ‹āđ‡āļ™ āļŦāļēāļāđ„āļĄāđˆāļĄāļĩāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš āļœāļđāđ‰āđ‚āļˆāļĄāļ•āļĩāļŠāļēāļĄāļēāļĢāļ–āļŠāļĢāđ‰āļēāļ‡āđ‚āļ—āđ€āļ„āđ‡āļ™āļ•āļēāļĄāļ­āļģāđ€āļ āļ­āđƒāļˆāđāļĨāļ°āļ›āļĨāļ­āļĄāļ•āļąāļ§āđ€āļ›āđ‡āļ™āļœāļđāđ‰āđƒāļŠāđ‰āđƒāļ”āđ† āđ„āļ”āđ‰ āļ„āļđāđˆāļĄāļ·āļ­āļ™āļĩāđ‰āļ„āļĢāļ­āļšāļ„āļĨāļļāļĄāļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāļāļēāļĢāļĨāļ‡āļ™āļēāļĄ JWT āļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒāļ—āļĩāđˆāļŠāļļāļ”āļŠāļēāļĄāđāļšāļšāđāļĨāļ°āļ§āļīāļ˜āļĩāļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļ•āđˆāļĨāļ°āđāļšāļš

āļāļĢāļ°āļšāļ§āļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš

āđ„āļĄāđˆāļ§āđˆāļēāļˆāļ°āđ€āļ›āđ‡āļ™āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāđƒāļ” āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™ JWT āļˆāļ°āļ—āļģāļ•āļēāļĄāļ‚āļąāđ‰āļ™āļ•āļ­āļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļ™:

  1. āđāļĒāļāđ‚āļ—āđ€āļ„āđ‡āļ™āļ—āļĩāđˆāļˆāļļāļ” . āđ€āļžāļ·āđˆāļ­āđāļĒāļ header, payload āđāļĨāļ° signature
  2. āļ–āļ­āļ”āļĢāļŦāļąāļŠ header āļ”āđ‰āļ§āļĒ base64url āđ€āļžāļ·āđˆāļ­āļ­āđˆāļēāļ™āļŸāļīāļĨāļ”āđŒ alg
  3. āļ„āļģāļ™āļ§āļ“āļĨāļēāļĒāđ€āļ‹āđ‡āļ™āđƒāļŦāļĄāđˆāļˆāļēāļ header āđāļĨāļ° payload āđ‚āļ”āļĒāđƒāļŠāđ‰āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāđāļĨāļ° key
  4. āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™āļ—āļĩāđˆāļ„āļģāļ™āļ§āļ“āđƒāļŦāļĄāđˆāļāļąāļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™āļ‚āļ­āļ‡āđ‚āļ—āđ€āļ„āđ‡āļ™
  5. āļŦāļēāļāļ•āļĢāļ‡āļāļąāļ™ āđāļŠāļ”āļ‡āļ§āđˆāļēāđ‚āļ—āđ€āļ„āđ‡āļ™āđ€āļ›āđ‡āļ™āļ‚āļ­āļ‡āđāļ—āđ‰

HS256 (HMAC-SHA256)

HS256 āđ€āļ›āđ‡āļ™āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāđāļšāļšāļŠāļĄāļĄāļēāļ•āļĢ â€” secret key āđ€āļ”āļĩāļĒāļ§āļāļąāļ™āđƒāļŠāđ‰āļ—āļąāđ‰āļ‡āļŠāļĢāđ‰āļēāļ‡āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™

signature = HMACSHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  secret
)

āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš āļ„āļģāļ™āļ§āļ“ HMAC āđƒāļŦāļĄāđˆāļ”āđ‰āļ§āļĒ shared secret āđāļĨāļ°āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš:

Token:   header.payload.sig
Secret:  "my-shared-secret"

1. āļ„āļģāļ™āļ§āļ“: HMACSHA256("header.payload", "my-shared-secret")
2. āđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļš: computedSignature === sig

āļ‚āđ‰āļ­āļ„āļ§āļĢāļžāļīāļˆāļēāļĢāļ“āļēāļ”āđ‰āļēāļ™āļ„āļ§āļēāļĄāļ›āļĨāļ­āļ”āļ āļąāļĒ: secret āļ•āđ‰āļ­āļ‡āđ€āļ›āđ‡āļ™āļ„āļ§āļēāļĄāļĨāļąāļš āļŦāļĄāļļāļ™āđ€āļ§āļĩāļĒāļ™āđ€āļ›āđ‡āļ™āļĢāļ°āļĒāļ° āđāļĨāļ°āļĄāļĩāđ€āļ­āļ™āđ‚āļ—āļĢāļ›āļĩāļ­āļĒāđˆāļēāļ‡āļ™āđ‰āļ­āļĒ 256 āļšāļīāļ• HS256 āđ„āļĄāđˆāđ€āļŦāļĄāļēāļ°āļŠāļģāļŦāļĢāļąāļšāļŠāļ–āļēāļ›āļąāļ•āļĒāļāļĢāļĢāļĄāđ„āļĄāđ‚āļ„āļĢāđ€āļ‹āļ­āļĢāđŒāļ§āļīāļŠāļ—āļĩāđˆāļšāļĢāļīāļāļēāļĢāļˆāļģāļ™āļ§āļ™āļĄāļēāļāļ•āđ‰āļ­āļ‡āļāļēāļĢ shared secret

RS256 (RSA-SHA256)

RS256 āđ€āļ›āđ‡āļ™āđāļšāļšāļ­āļŠāļĄāļĄāļēāļ•āļĢ āļœāļđāđ‰āļ­āļ­āļāļĨāļ‡āļ™āļēāļĄāļ”āđ‰āļ§āļĒ private key; āļœāļđāđ‰āļ•āļĢāļ§āļˆāļŠāļ­āļšāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ”āđ‰āļ§āļĒ public key āļ—āļĩāđˆāđ€āļāļĩāđˆāļĒāļ§āļ‚āđ‰āļ­āļ‡

signature = RSASHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļš āđƒāļŠāđ‰ public key:

Token:   header.payload.sig
Public:  "-----BEGIN PUBLIC KEY-----..."

1. āđ‚āļŦāļĨāļ” RSA public key
2. āļ•āļĢāļ§āļˆāļŠāļ­āļš: RSA_SHA256_verify("header.payload", sig, publicKey)

āļ‚āđ‰āļ­āļ”āļĩ: āļ„āļĩāļĒāđŒāļāļēāļĢāļĨāļ‡āļ™āļēāļĄāđāļĨāļ°āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđāļĒāļāļˆāļēāļāļāļąāļ™ āļšāļĢāļīāļāļēāļĢāđƒāļ”āđ† āļŠāļēāļĄāļēāļĢāļ–āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ„āļ”āđ‰āđ‚āļ”āļĒāđ„āļĄāđˆāļ•āđ‰āļ­āļ‡āļ–āļ·āļ­ secret public key āļŠāļēāļĄāļēāļĢāļ–āđƒāļŦāđ‰āļšāļĢāļīāļāļēāļĢāļˆāļēāļ endpoint JWKS āđ€āļžāļ·āđˆāļ­āļāļēāļĢāļŦāļĄāļļāļ™āđ€āļ§āļĩāļĒāļ™āļ—āļĩāđˆāļ‡āđˆāļēāļĒ

ES256 (ECDSA-SHA256)

ES256 āđƒāļŠāđ‰ ECDSA āļāļąāļšāđ€āļŠāđ‰āļ™āđ‚āļ„āđ‰āļ‡ P-256 āđ€āļŠāđˆāļ™āđ€āļ”āļĩāļĒāļ§āļāļąāļš RS256 āđ€āļ›āđ‡āļ™āđāļšāļšāļ­āļŠāļĄāļĄāļēāļ•āļĢ

signature = ECDSA_SHA256(
  base64urlEncode(header) + "." + base64urlEncode(payload),
  privateKey
)

āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāđƒāļŠāđ‰ ECDSA P-256 public key ES256 āļŠāļĢāđ‰āļēāļ‡āļĨāļēāļĒāđ€āļ‹āđ‡āļ™āļ—āļĩāđˆāđ€āļĨāđ‡āļāļāļ§āđˆāļēāļĄāļēāļ (64 āđ„āļšāļ•āđŒ āđ€āļ—āļĩāļĒāļšāļāļąāļš 256 āđ„āļšāļ•āđŒāļŠāļģāļŦāļĢāļąāļš RSA-2048) āđāļĨāļ°āđƒāļŦāđ‰āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ—āļĩāđˆāđ€āļĢāđ‡āļ§āļāļ§āđˆāļē

āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄ

| āļ„āļļāļ“āļŠāļĄāļšāļąāļ•āļī | HS256 | RS256 | ES256 | |----------|-------|-------|-------| | āļ›āļĢāļ°āđ€āļ āļ—āļ„āļĩāļĒāđŒ | āļŠāļĄāļĄāļēāļ•āļĢ (shared secret) | āļ­āļŠāļĄāļĄāļēāļ•āļĢ (āļ„āļđāđˆ RSA) | āļ­āļŠāļĄāļĄāļēāļ•āļĢ (āļ„āļđāđˆ EC) | | āļ‚āļ™āļēāļ”āļĨāļēāļĒāđ€āļ‹āđ‡āļ™ | 32 āđ„āļšāļ•āđŒ | 256 āđ„āļšāļ•āđŒ | 64 āđ„āļšāļ•āđŒ | | āļāļēāļĢāđāļˆāļāļˆāđˆāļēāļĒāļ„āļĩāļĒāđŒ | āđāļŠāļĢāđŒāļ­āļĒāđˆāļēāļ‡āļĨāļąāļšāđ† | public key āđ€āļ›āđ‡āļ™āļŠāļēāļ˜āļēāļĢāļ“āļ° | public key āđ€āļ›āđ‡āļ™āļŠāļēāļ˜āļēāļĢāļ“āļ° | | āļāļēāļĢāļŦāļĄāļļāļ™āđ€āļ§āļĩāļĒāļ™ | āļ›āļēāļ™āļāļĨāļēāļ‡ | āļ‡āđˆāļēāļĒ (JWKS) | āļ‡āđˆāļēāļĒ (JWKS) | | āļāļĢāļ“āļĩāļāļēāļĢāđƒāļŠāđ‰āļ‡āļēāļ™ | āļĢāļ°āļšāļšāļ āļēāļĒāđƒāļ™āļ—āļĩāđˆāđ€āļŠāļ·āđˆāļ­āļ–āļ·āļ­āđ„āļ”āđ‰ | API āđāļšāļšāļāļĢāļ°āļˆāļēāļĒ | āļĄāļ·āļ­āļ–āļ·āļ­, IoT |

āļ‚āđ‰āļ­āļœāļīāļ”āļžāļĨāļēāļ”āđƒāļ™āļāļēāļĢāļ•āļĢāļ§āļˆāļŠāļ­āļšāļ—āļĩāđˆāļžāļšāļšāđˆāļ­āļĒ

  • āļāļēāļĢāđ‚āļˆāļĄāļ•āļĩāļŠāļąāļšāļŠāļ™āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄ āļŦāļēāļāļĢāļŦāļąāļŠāļ‚āļ­āļ‡āļ„āļļāļ“āļ­āđˆāļēāļ™ alg āļˆāļēāļāđ‚āļ—āđ€āļ„āđ‡āļ™āđ‚āļ”āļĒāđ„āļĄāđˆāļšāļąāļ‡āļ„āļąāļšāđƒāļŠāđ‰ āļœāļđāđ‰āđ‚āļˆāļĄāļ•āļĩāļŠāļēāļĄāļēāļĢāļ–āđ€āļ›āļĨāļĩāđˆāļĒāļ™āļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāđ„āļ”āđ‰ āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ€āļŠāļĄāļ­āļ§āđˆāļēāļ­āļąāļĨāļāļ­āļĢāļīāļ—āļķāļĄāļ•āļĢāļ‡āļāļąāļšāļ„āđˆāļēāļ—āļĩāđˆāļ„āļēāļ”āļŦāļ§āļąāļ‡
  • āļāļēāļĢāļĒāļ­āļĄāļĢāļąāļš alg: "none" āđ„āļĨāļšāļĢāļēāļĢāļĩāļšāļēāļ‡āļ•āļąāļ§āļĒāļ­āļĄāļĢāļąāļšāđ‚āļ—āđ€āļ„āđ‡āļ™āļ—āļĩāđˆāđ„āļĄāđˆāđ„āļ”āđ‰āļĨāļ‡āļ™āļēāļĄ āļ›āļāļīāđ€āļŠāļ˜ alg: "none" āļ­āļĒāđˆāļēāļ‡āļŠāļąāļ”āđ€āļˆāļ™
  • āļāļēāļĢāļ•āļąāļ”āļ—āļ­āļ™āļĨāļēāļĒāđ€āļ‹āđ‡āļ™ āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāđāļšāļšāđ„āļĄāđˆāđƒāļŠāđ‰āđ€āļ§āļĨāļēāļ„āļ‡āļ—āļĩāđˆāļŠāļēāļĄāļēāļĢāļ–āļĢāļąāđˆāļ§āđ„āļŦāļĨāļ‚āđ‰āļ­āļĄāļđāļĨāļœāđˆāļēāļ™ timing attacks āđƒāļŠāđ‰āļāļēāļĢāđ€āļ›āļĢāļĩāļĒāļšāđ€āļ—āļĩāļĒāļšāđƒāļ™āļ•āļąāļ§āļ‚āļ­āļ‡āđ„āļĨāļšāļĢāļēāļĢāļĩ JWT āļ‚āļ­āļ‡āļ„āļļāļ“

āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ—āđ€āļ„āđ‡āļ™ JWT āļ­āļ­āļ™āđ„āļĨāļ™āđŒ

āđƒāļŠāđ‰āđ€āļ„āļĢāļ·āđˆāļ­āļ‡āļĄāļ·āļ­āļ–āļ­āļ”āļĢāļŦāļąāļŠ JWT āđ€āļžāļ·āđˆāļ­āļ–āļ­āļ”āļĢāļŦāļąāļŠāđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāđ‚āļ—āđ€āļ„āđ‡āļ™āđƒāļ”āđ† āļ§āļēāļ‡āđ‚āļ—āđ€āļ„āđ‡āļ™ āļ”āļđ header āđāļĨāļ° payload āđāļĨāļ°āļ•āļĢāļ§āļˆāļŠāļ­āļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™āđ‚āļ”āļĒāļĢāļ°āļšāļļ secret āļŦāļĢāļ·āļ­ public key āļ—āļĩāđˆāđ€āļŦāļĄāļēāļ°āļŠāļĄ āļāļēāļĢāļ›āļĢāļ°āļĄāļ§āļĨāļœāļĨāļ—āļąāđ‰āļ‡āļŦāļĄāļ”āđ€āļāļīāļ”āļ‚āļķāđ‰āļ™āđƒāļ™āđ€āļšāļĢāļēāļ§āđŒāđ€āļ‹āļ­āļĢāđŒāļ‚āļ­āļ‡āļ„āļļāļ“

āļ§āļīāļ˜āļĩāļ•āļĢāļ§āļˆāļŠāļ­āļšāļĨāļēāļĒāđ€āļ‹āđ‡āļ™ JWT: HS256, RS256 āđāļĨāļ° ES256 - CoolTool