Не удается найти способ расшифровки токена JWE в python (но созданный в ASP.Net) с помощью jwcrypto - PullRequest
0 голосов
/ 11 февраля 2019

У меня возникают проблемы с расшифровкой моего токена JWE в python после его шифрования с использованием ASP.Net.

Вот мой код C # (поддельные пароли):

var signingKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("ae743683f78d498a9026d0c87020b9d3"));
var secret = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("MbPeShVmYq3t6w9z"));

var signingCreds = new SigningCredentials(signingKey, SecurityAlgorithms.HmacSha256);
var encryptingCreds = new EncryptingCredentials(secret, SecurityAlgorithms.Aes128KW, SecurityAlgorithms.Aes128CbcHmacSha256);
var handler = new JwtSecurityTokenHandler();

var jwtSecurityToken = handler.CreateJwtSecurityToken(
    _issuer,
    _audience,
    new ClaimsIdentity(claimsList),
    DateTime.Now,
    _expires,
    DateTime.Now,
    signingCreds,
    encryptingCreds);

var token = handler.WriteToken(jwtSecurityToken);

токенвыглядит следующим образом при использовании учетных данных шифрования (не должно typ быть JWE?):

{
    {
        "alg": "A128KW",
        "enc": "A128CBC-HS256",
        "typ": "JWT"
    }.{
        "userId": "151aedd5-76c3-4eb2-8b73-a16004315731",
        "prop1": "test1",
        "prop2": "test2",
        "nbf": 1549894420,
        "exp": 1550240017,
        "iat": 1549894420,
        "iss": "https://localhost:56880/",
        "aud": "https://localhost:56880/"
    }
}

Это токен при шифровании:

eyJhbGciOiJBMTI4S1ciLCJlbmMiOiJBMTI4Q0JDLUhTMjU2IiwidHlwIjoiSldUIn0.4w4MZv5WFALGbXhmaYqtTv1VGrUpQpDJ0jN8VmLpQwDRU0j16RbPyg.hGt_z5j8THCiNEhpVvlJmw.WehLBKdyB_eYtDRvHxJHgYwa4GA7f8oKYf3GgIqAAih1eVqU084kHu1lIhC8ibxxziwmFZ4IhBFT-nWgWQrH9thhgqndF4ojtGRBgdHtW3GDAgYV6fgI11h6meyBBuLBs7mkQC5PX8EYsMTDiNE9iNTH4pWtDElc07CGGXlHsm6ntuq7G3sinagZtZMchy1shTY73NTS40FqW37C9HTIPDbrTdsm-USHcGaBMLSmjF5eOZ9Po3p4fhRT42l_gwJc9tlurttYBucvIiO1r_3NB8xGeORizYW1P_P9XGusAFy4L8h8XU9P0FctsMjUFy64LOIK8Qv8YZVq4q82vv-r9uGH6bApUdpCIcYFfGu86w63t1QLQcDT_OYMCqwo9ZmZP5Gd07lB1ypNZbP6hQTgkosp3js3i4K4bFQY7CiSXB_pSTH623TMLHNfUXWMRMIBHmXGr-zTZiKj5vkVUZLjNg.sdBUYvadnwMhkCXP8sABgA

Я пыталсяпара различных пакетов Python, включая 2 версии jose (python-jose и jose), но не смог заставить jose работать с шифрованием (похоже, не поддерживает алгоритм A128KW).

Сейчас япытается jwcrypto, но кажется, что я сгенерирую новый ключ, а не использую свой существующий (тот, который использовался для шифрования JWT в ASP.Net):

from jwcrypto import jwk, jwe

encrypted_token = request.cookies.get(cookie_name)  
private_key = "MbPeShVmYq3t6w9z"

jwk_key = jwk.JWK()

# not sure how to use my existing "private_key" value, 
# and no support for "A128KW" with jwcrypto despite 
# the documentation saying there is support
key = jwk_key.import_key(alg='A128KW', kty="A256CBC-HS512")

jwe_token = jwe.JWE()
jwe_token.deserialize(encrypted_token)
jwe_token.decrypt(key) # decrypt requires an instance of JWK
decrypted_payload = jwe_token.payload

Как я могу получить этоРабота?Спасибо за любой совет, который вы можете дать.

1 Ответ

0 голосов
/ 12 февраля 2019

Похоже, python-jose НЕ поддерживает JWE.В их онлайновой документации или в исходном коде я не могу найти ни одной строки кода, связанной с анализом или шифрованием / дешифрованием JWE.

Надеюсь, в списке библиотек изjwt.io, я обнаружил jwcrypto , который должен поддерживать такой зашифрованный токен (см. этот пример, имеющий дело с A256KW ), и в коде источника мы можем видеть A128KW в списке .

Вы можете попробовать.

from jwcrypto import jwk, jwe

encrypted_token = request.cookies.get(cookie_name)  

key = jwk.JWK.from_json('{"kty":"oct","k":"TWJQZVNoVm1ZcTN0Nnc5eg"}')

jwe_token = jwe.JWE()
jwe_token.deserialize(encrypted_token)
jwe_token.decrypt(key)
decrypted_payload = jwe_token.payload
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...