Подумайте о 2 типах алгоритмов шифрования: < /p>
[*] hmac (symmetric): < /strong>
Есть только 1 ключ, AKA
jwt будет подписан и варится с использованием той же секрета. /> rsa (асимметричный): < /strong>
Есть 2 клавиши. Частный ключ и открытый ключ.
JWT будет подписан с использованием закрытого ключа, а подпись будет подтверждена с использованием открытого ключа. Учетные данные. Конечная точка, такая как /.well-known/jwks.json.
< /li>
Злоумышленник сейчас: < /p>
Загружает общедоступный ключ. Ключ. using the public key, but fails, because the public key can only verify signatures that have been generated using the private key (asymmetric encryption).
[*]However, since in this scenario the attacker had modified the encryption algorithm to HMAC (a symmetrical encryption), the server attempted and succeeded in verifying signature using its открытый ключ. < /p>
< /li>
Это происходит, потому что HMAC является симметричным шифрованием, и ключ, который используется для подписи JWT, является тем же ключом, который будет использоваться для его проверки. Алгоритм используется HMAC, JWT подтверждается. < /p>
< /li>
< /ol>
< /blockquote>
Я пытаюсь понять, как именно атакующий может «подписать JWT с открытым конфиденциальным ключом» (я хочу написать тест на единицу, чтобы проверить, что мой логик реализации не может быть уязвимым). Чтобы реализовать эту логику в Python, используя библиотеку jwcrypto .
Код: Выделить всё
from jwcrypto.jwt import JWT
ec_key = load_jwk("sign-ec-p256") # This is a function that will load a jwcrypto.jwk.JWK object of type `EC` with only the public part
jwt_object = JWT(header={"alg":"HS256", "kid": "sign-ec-p256"}, claims={"iss": "https://my-domain.com"})
jwt_object.make_signed_token(ec_key)
< /code>
Я получаю трассировку стека в библиотеке, потому что она пытается загрузить личную часть, которой нет, и, таким образом, запускает ошибку, прежде чем я смогу когда -либо получить плохо подписанный jwt. < /p>
Из того, что я понимаю, мне кажется, что: < /p>
. API в сериализованной форме, и если десериализация ключевого объекта выполняется только путем доверия ALG
Библиотека Jwcrypto избегает этой проблемы, потому что его API требует, чтобы ключевые объекты уже были десерициализированы перед тем, как их использование в функциях подписи/версии; Это непостоянное правильно? Что «путаница в алгоритме jwt» связана с разрешением jwt alg значение направлять десериализацию ключа, представленного в программе как строка?
Подробнее здесь: https://stackoverflow.com/questions/796 ... in-order-t