
Легковесная Python-библиотека для обфускации значений полезной нагрузки JWT с использованием XOR-шифрования на основе ключей с временными метками, предотвращающая декодирование в открытом виде конфиденциальных утверждений, таких как идентификаторы пользователей.
JSON Web Token (JWT, произносится «джот») — это компактный и URL-безопасный способ передачи JSON-сообщения между двумя сторонами. Это стандарт, определённый в RFC 7519. Токен представляет собой длинную строку, разделённую точками на части. Каждая часть закодирована в base64 URL.
Состав частей зависит от типа JWT: JWS (подписанный токен) или JWE (зашифрованный токен). Если токен подписан, он состоит из трёх секций: заголовка, полезной нагрузки и подписи. Если токен зашифрован, он состоит из пяти частей: заголовка, зашифрованного ключа, вектора инициализации, зашифрованного текста (полезной нагрузки) и аутентификационного тега. Наиболее часто JWT используются в качестве токенов доступа и ID-токенов в процессах OAuth и OpenID Connect, но они также могут применяться для других целей.
Этот код предлагает подход к повышению безопасности секции полезной нагрузки при декодировании JWT-токенов, где хранящиеся ключи видны в открытом виде. Обычно при декодировании JWT-токена (base64) секция полезной нагрузки отображается в виде обычного текста. Основная цель — слегка зашифровать или запутать значения полезной нагрузки, чтобы затруднить понимание их смысла. Намерение — гарантировать, что даже если кто-то попытается декодировать значения полезной нагрузки, он не сможет сделать это легко.
Идея, лежащая в основе попытки скрыть значение ключа с именем «userid», заключается в следующем:
и..^^
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'
Попытка подделать JWT-токены, созданные с помощью этого метода, требует доступа как к секретному ключу JWT, так и к симметричному ключу XOR, используемому для создания 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='}
