Skip to main content

V3.5.3 Token-based Session Management

Requirement:#

Verify that stateless session tokens use digital signatures, encryption, and other countermeasures to protect against tampering, enveloping, replay, null cipher, and key substitution attacks.

Explanation:#

Подпись создается кодированием Base64 заголовка и полезной нагрузки, а также указанным методом шифрования в заголовке. Эта веб-подпись JSON (JWS) соответствует стандартом RFC 7515 .

Окончательная подпись создается следующим образом:

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

Части токена разделены точкой, так как этот символ не встречается в кодировке Base64. В этом случае генерируется этот вывод:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6ImItbm92YSIsImFkbWluIjp0cnVlLCJpYXQiOjE1MTYyMzkwMjJ9.
YDrKvpHj3s2B1Xm4SWQuFzs4fAkrUkDuyofBGdeQ27E

Remediation:#

Компактная сериализация JWS — это классический вариант подписанного JWT. Потому что это настолько компактно, что токен можно отправить, например, через URL. Он состоит из трех частей, описанных выше: заголовок, полезная нагрузка, подпись.  Это означает, что только одна подпись может быть размещена над заголовком и полезной нагрузкой.  С вариантом сериализации JSON ранее описанный недостаток устраняется с помощью только одной подписи. Потому что здесь можно разместить несколько подписей поверх одной и той же полезной нагрузки и заголовка. Однако у этого типа есть недостаток, заключающийся в том, что он больше не является безопасным для URL-адресов. Кроме того, из-за используемой орфографии этот формат уже не очень компактен.

Структура разделена на 2 части верхнего уровня payload и signatures. Signatures, в свою очередь, делится еще на три части: protected, header и signature Payload — это полная полезная нагрузка JWS с кодировкой Base64.

{
"payload": "eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ",
"signatures": [
{
"protected": "eyJhbGciOiJSUzI1NiJ9",
"header": {
"kid": "2010-12-29"
},
"signature": "cC4hiUPoj9Eetdgtv3hF80EGrhuB__dzERat0XF9g2VtQgr9PJbu3XOiZj5RZmh7AAuHIm4Bh-0Qc_lF5YKt_O8W2Fp5jujGbds9uJdbF9CUAr7t1dnZcAcQjbKBYNX4BAynRFdiuB--f_nZLgrnbyTyWzO5vRK5h6xBArLIARNPvkSjtQBMHlb1L07Qe7K0GarZRmB_eSN9383LcOLn6_dO--xi12jzDwusC-OkHWEsqtFZESc6BfI7noOPqvhJ1phCnvWh6IeYI2w9QOYEUipUTI8np6LbgGY9Fs98rqVt5AXLIhWkWywlVmtVrBp0igcN_IoypGlUPQGe77Rw"
},
{
"protected": "eyJhbGciOiJFUzI1NiJ9",
"header": {
"kid": "e9bc097a-ce51-4036-9562-d2ade882db0d"
},
"signature": "DtEhU3ljbEg8L38VWAfUAqOyKAM6-Xx-F4GawxaepmXFCgfTjDxw5djxLa8ISlSApmWQxfKTUJqPP3-Kg6NU1Q"
}
]
}

Additional:#

https://b-nova.com/en/home/content/stateless-sessions-thanks-to-json-web-tokens

https://habr.com/ru/company/X5Tech/blog/486778/