What it does. Implements secure JWT (RFC 7519) signing and verification using HMAC-SHA256, RSA-PSS, ES256, and EdDSA, including token expiration, claims validation, and defenses against algorithm-confusion, none-algorithm, and key-injection attacks. Use when adding or hardening JWT-based authentication/authorization, or when auditing token verification code for common JWT vulnerabilities. Part of mukul975/Anthropic-Cybersecurity-Skills (817 security skills) (mukul975/Anthropic-Cybersecurity-Skills).
Install
npx skills add mukul975/Anthropic-Cybersecurity-Skills --skill implementing-jwt-signing-and-verification, or copy the skill folder into ~/.claude/skills/implementing-jwt-signing-and-verification/.
- Raw file:
curl -sL https://raw.githubusercontent.com/mukul975/Anthropic-Cybersecurity-Skills/HEAD/skills/implementing-jwt-signing-and-verification/SKILL.md
SKILL.md (verbatim)
name: implementing-jwt-signing-and-verification
description: >-
Implements secure JWT (RFC 7519) signing and verification using HMAC-SHA256,
RSA-PSS, ES256, and EdDSA, including token expiration, claims validation, and
defenses against algorithm-confusion, none-algorithm, and key-injection
attacks. Use when adding or hardening JWT-based authentication/authorization,
or when auditing token verification code for common JWT vulnerabilities.
domain: cybersecurity
subdomain: cryptography
tags:
- cryptography
- jwt
- authentication
- token-security
- digital-signatures
version: '1.0'
author: mahipal
license: Apache-2.0
nist_csf:
- PR.DS-01
- PR.DS-02
- PR.DS-10
mitre_attack:
- T1600
- T1573
- T1553
Implementing JWT Signing and Verification
Overview
JSON Web Tokens (JWT) defined in RFC 7519 are compact, URL-safe tokens used for authentication and authorization in web applications. This skill covers implementing secure JWT signing with HMAC-SHA256, RSA-PSS, and EdDSA algorithms, along with verification, token expiration, claims validation, and defense against common JWT attacks (algorithm confusion, none algorithm, key injection).
When to Use
- When deploying or configuring implementing jwt signing and verification capabilities in your environment
- When establishing security controls aligned to compliance requirements
- When building or improving security architecture for this domain
- When conducting security assessments that require this implementation
Prerequisites
- Familiarity with cryptography concepts and tools
- Access to a test or lab environment for safe execution
- Python 3.8+ with required dependencies installed
- Appropriate authorization for any testing activities
Objectives
- Implement JWT signing with HS256, RS256, ES256, and EdDSA
- Verify JWT signatures and validate standard claims
- Implement token expiration, not-before, and audience validation
- Defend against algorithm confusion and none algorithm attacks
- Implement JWT key rotation with JWK Sets
- Build a complete authentication middleware
Key Concepts
JWT Algorithms
| Algorithm |
Type |
Key |
Security Level |
| HS256 |
Symmetric (HMAC) |
Shared secret |
128-bit |
| RS256 |
Asymmetric (RSA) |
RSA key pair |
112-bit |
| ES256 |
Asymmetric (ECDSA) |
P-256 key pair |
128-bit |
| EdDSA |
Asymmetric (Ed25519) |
Ed25519 pair |
128-bit |
Common JWT Attacks
- Algorithm confusion: Switching from RS256 to HS256, using public key as HMAC secret
- None algorithm: Setting alg=none to bypass signature verification
- Key injection: Embedding key in JWK header
- Weak secrets: Brute-forcing short HMAC secrets
- Token replay: Reusing valid tokens without expiration
Security Considerations
- Always validate the algorithm header against an allowlist
- Never accept alg=none in production
- Use asymmetric algorithms (RS256, ES256) for distributed systems
- Set short expiration times (15 min for access tokens)
- Implement token refresh mechanism
- Store secrets securely (not in source code)
Validation Criteria
Other files in this skill
assets/template.md (verbatim)
JWT Implementation Template
Algorithm Selection Guide
| Use Case |
Recommended Algorithm |
Reason |
| Single server |
HS256 |
Simple, fast, shared secret |
| Microservices |
RS256 / ES256 |
Asymmetric, verify without secret |
| Mobile/IoT |
ES256 |
Small key/signature size |
| High performance |
EdDSA |
Fastest asymmetric signing |
JWT Claims Checklist
Security Checklist
references/api-reference.md (verbatim)
API Reference: Implementing JWT Signing and Verification
PyJWT Library
import jwt
# Sign with HS256
token = jwt.encode({"sub": "user1", "exp": time.time() + 3600}, "secret", algorithm="HS256")
# Verify
payload = jwt.decode(token, "secret", algorithms=["HS256"])
# Sign with RS256
token = jwt.encode(payload, private_key, algorithm="RS256")
payload = jwt.decode(token, public_key, algorithms=["RS256"])
JWT Algorithms
| Algorithm |
Type |
Key Size |
Use Case |
| HS256 |
HMAC |
256-bit secret |
Internal services |
| RS256 |
RSA |
2048+ bit |
Public verification |
| ES256 |
ECDSA |
P-256 curve |
Compact tokens |
| EdDSA |
Ed25519 |
256-bit |
High performance |
| none |
- |
- |
NEVER use in production |
Standard JWT Claims (RFC 7519)
| Claim |
Type |
Description |
iss |
String |
Issuer |
sub |
String |
Subject |
aud |
String/Array |
Audience |
exp |
NumericDate |
Expiration time |
nbf |
NumericDate |
Not before |
iat |
NumericDate |
Issued at |
jti |
String |
JWT ID (unique) |
Common JWT Attacks
| Attack |
Description |
Mitigation |
| Algorithm confusion |
Switch RS256 to HS256 |
Explicit algorithm allowlist |
| none algorithm |
Remove signature |
Reject alg=none |
| JKU/JWK injection |
Inject attacker key |
Ignore JKU/JWK headers |
| Token replay |
Reuse valid token |
Use jti + short exp |
References
references/standards.md (verbatim)
Standards and References - JWT Signing and Verification
Primary Standards
RFC 7519 - JSON Web Token (JWT)
RFC 7515 - JSON Web Signature (JWS)
RFC 7517 - JSON Web Key (JWK)
RFC 7518 - JSON Web Algorithms (JWA)
RFC 8725 - JWT Best Current Practices
OWASP References
OWASP JWT Cheat Sheet
Python Libraries
PyJWT
python-jose
references/workflows.md (verbatim)
Workflows - JWT Signing and Verification
Workflow 1: Token Issuance
[Authentication Request] (username + password)
|
[Validate Credentials]
|
[Build JWT Claims]:
- sub: user ID
- iss: issuer URL
- aud: audience
- exp: expiration (now + 15 min)
- iat: issued at
- jti: unique token ID
|
[Sign with Private Key / Secret]
(RS256 / ES256 / HS256)
|
[Return: access_token + refresh_token]
Workflow 2: Token Verification
[Incoming Request with Bearer Token]
|
[Extract Token from Authorization Header]
|
[Decode Header (without verification)]
[Check alg against allowlist]
|
[Verify Signature]
(using public key / shared secret)
|
[Validate Claims]:
- exp: not expired
- nbf: not before current time
- iss: expected issuer
- aud: expected audience
|
[Accept / Reject Request]
Workflow 3: Key Rotation
[Generate New Signing Key]
|
[Add to JWK Set with unique kid]
|
[Update /.well-known/jwks.json]
(new key + old key)
|
[New tokens signed with new key]
[Old tokens still verify with old key]
|
[After grace period: remove old key]
Back to mukul975/Anthropic-Cybersecurity-Skills (817 security skills) or Agent skills.