
Bibliothèque Python légère pour obscurcir les valeurs de payload JWT en utilisant le chiffrement XOR avec des clés basées sur le timestamp, empêchant le décodage en texte clair de revendications sensibles comme les identifiants utilisateur.
Un JSON Web Token (JWT, prononcé "jote") est un moyen compact et sûr pour URL de passer un message JSON entre deux parties. C'est une norme, définie dans la RFC 7519. Le token est une longue chaîne, divisée en parties séparées par des points. Chaque partie est encodée en base64 URL.
Les parties du token dépendent du type de JWT : s'il s'agit d'un JWS (token signé) ou d'un JWE (token chiffré). Si le token est signé, il aura trois sections : l'en-tête, la charge utile (payload) et la signature. Si le token est chiffré, il se compose de cinq parties : l'en-tête, la clé chiffrée, le vecteur d'initialisation, le texte chiffré (payload) et le tag d'authentification. Le cas d'utilisation le plus courant des JWT est probablement de les utiliser comme jetons d'accès et jetons d'identité dans les flux OAuth et OpenID Connect, mais ils peuvent également servir à d'autres fins.
Cet extrait de code propose une perspective d'astuce visant à améliorer la sécurité de la section du payload lors du décodage des tokens JWT, où les clés stockées sont visibles en texte clair. Cet extrait de code propose une perspective d'astuce visant à améliorer la sécurité de la section du payload lors du décodage des tokens JWT. Généralement, la section du payload apparaît en texte clair lorsqu'elle est décodée à partir du token JWT (base64). L'objectif principal est de chiffrer légèrement ou d'obfusquer les valeurs du payload, rendant difficile la compréhension de leur signification. L'intention est de garantir que même si quelqu'un tente de décoder les valeurs du payload, il ne pourra pas le faire facilement.
L'idée derrière la tentative d'obfusquer la valeur de la clé nommée "userid" est la suivante :
et..^^
in the example, the key is shown as { 'userid': 'random_value' },
making it apparent that it represents a user ID.
However, this is merely for illustrative purposes.
In practice, a predetermined and undisclosed name is typically used.
For example, 'a': 'changing_random_value'
Tenter de falsifier des tokens JWT générés avec cette méthode nécessite l'accès à la fois à la clé secrète JWT et à la clé symétrique XOR utilisée pour créer le UserID.
# python3 main.py
- Current Unix Timestamp: 1709160368
- Current Unix Timestamp to Human Readable: 2024-02-29 07:46:08
- userid: 23243232
- XOR Symmetric key: b'generally_user_salt_or_hash_or_random_uuid_this_value_must_be_in_dbms'
- JWT Secret key: yes_your_service_jwt_secret_key
- Encoded UserID and Timestamp: VVZcUUFTX14FOkdEUUFpEVZfTWwKEGkLUxUKawtHOkAAW1RXDGYWQAo=
- Decoded UserID and Hashed Timestamp: 23243232|e27436b7393eb6c2fb4d5e2a508a9c5c
- JWT Token: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0aW1lc3RhbXAiOiIyMDI0LTAyLTI5IDA3OjQ2OjA4IiwidXNlcmlkIjoiVlZaY1VVRlRYMTRGT2tkRVVVRnBFVlpmVFd3S0VHa0xVeFVLYXd0SE9rQUFXMVJYREdZV1FBbz0ifQ.bM_6cBZHdXhMZjyefr6YO5n5X51SzXjyBUEzFiBaZ7Q
- Decoded JWT: {'timestamp': '2024-02-29 07:46:08', 'userid': 'VVZcUUFTX14FOkdEUUFpEVZfTWwKEGkLUxUKawtHOkAAW1RXDGYWQAo='}
# run again
- Decoded JWT: {'timestamp': '2024-02-29 08:16:36', 'userid': 'VVZcUUFTX14FaRNAVBRpRQcORmtWRGleVUtRZlYXaBZZCgYOWGlDR10='}
- Decoded JWT: {'timestamp': '2024-02-29 08:16:51', 'userid': 'VVZcUUFTX14FZxMRVUdnEgJZEmxfRztRVUBabAsRZkdVVlJWWztGQVA='}
- Decoded JWT: {'timestamp': '2024-02-29 08:17:01', 'userid': 'VVZcUUFTX14FbxYQUkM8RVRZEmkLRWsNUBYNb1sQPREFDFYKDmYRQV4='}
- Decoded JWT: {'timestamp': '2024-02-29 08:17:09', 'userid': 'VVZcUUFTX14FbUNEVEVqEFlaTGoKQjxZBRULOlpGPUtSClALWD5GRAs='}
