
Leichte Python-Bibliothek zum Verschleiern von JWT-Payload-Werten mittels XOR-Verschlüsselung mit zeitstempelbasierten Schlüsseln, die eine Dekodierung sensibler Claims wie Benutzer-IDs im Klartext verhindert.
Ein JSON Web Token (JWT, ausgesprochen "jot") ist eine kompakte und URL-sichere Möglichkeit, eine JSON-Nachricht zwischen zwei Parteien zu übermitteln. Es ist ein Standard, definiert in RFC 7519. Das Token ist eine lange Zeichenkette, die in durch Punkte getrennte Teile unterteilt ist. Jeder Teil ist base64-URL-kodiert.
Welche Teile das Token hat, hängt von der Art des JWT ab: ob es sich um ein JWS (ein signiertes Token) oder ein JWE (ein verschlüsseltes Token) handelt. Wenn das Token signiert ist, hat es drei Abschnitte: den Header, die Payload und die Signatur. Wenn das Token verschlüsselt ist, besteht es aus fünf Teilen: Header, verschlüsselter Schlüssel, Initialisierungsvektor, Chiffretext (Payload) und Authentifizierungs-Tag. Die wohl häufigste Verwendung von JWTs ist die als Zugriffstoken und ID-Token in OAuth- und OpenID-Connect-Abläufen, aber sie können auch für andere Zwecke verwendet werden.
Dieses Code-Snippet bietet eine Perspektive für eine Anpassung, die darauf abzielt, die Sicherheit des Payload-Abschnitts beim Dekodieren von JWT-Tokens zu erhöhen, wenn die gespeicherten Schlüssel im Klartext sichtbar sind. Dieses Code-Snippet bietet eine Perspektive für eine Anpassung, die darauf abzielt, die Sicherheit des Payload-Abschnitts beim Dekodieren von JWT-Tokens zu erhöhen. Normalerweise erscheint der Payload-Abschnitt beim Dekodieren des JWT-Tokens (base64) im Klartext. Das Hauptziel ist es, die Payload-Werte leicht zu verschlüsseln oder zu verschleiern, sodass es schwierig ist, ihre Bedeutung zu erkennen. Die Absicht ist sicherzustellen, dass selbst wenn jemand versucht, die Payload-Werte zu dekodieren, dies nicht einfach möglich ist.
Die Idee hinter dem Versuch, den Wert des Schlüssels namens "userid" zu verschleiern, ist wie folgt:
und..^^
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'
Der Versuch, mit dieser Methode erstellte JWT-Tokens zu manipulieren, erfordert Zugriff sowohl auf den JWT-Geheimschlüssel als auch auf den symmetrischen XOR-Schlüssel, der zum Erstellen der Benutzer-ID verwendet wird.
# 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='}
