【问题标题】:Cannot find a way to decrypt a JWE token in python (but created in ASP.Net) using jwcrypto找不到使用 jwcrypto 在 python 中解密 JWE 令牌(但在 ASP.Net 中创建)的方法
【发布时间】:2019-07-05 02:21:34
【问题描述】:

使用 ASP.Net 加密我的 JWE 令牌后,我无法在 python 中解密它。

这是我的 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-josejose),但无法让 jose 使用加密(似乎不支持 A128KW 算法)。

我现在正在尝试jwcrypto,但它似乎希望我生成一个新密钥,而不是使用我现有的密钥(用于在 ASP.Net 中加密 JWT 的那个):

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

我怎样才能让它工作?感谢您提供的任何建议。

【问题讨论】:

    标签: python asp.net encryption jwt


    【解决方案1】:

    看起来python-jose 不支持 JWE。在他们的 online documentationin the source code 中,我找不到任何与 JWE 解析或加密/解密相关的代码行。

    希望在 jwt.io 的库列表中,我找到了应该支持这种加密令牌的 jwcrypto(参见 this example dealing with A256KW),并且在源代码中我们可以看到 A128KW is listed

    你可以试一试。

    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
    

    【讨论】:

    • 谢谢。我之前尝试过jwcrypto 并为此苦苦挣扎,但现在我再次尝试。问题是我已经有一个私钥(从 ASP.Net 创建),所以我需要重用它,但jwcrypto 似乎建议我必须使用 JWK 对象,我只能生成一个新密钥来创建一个实例那个物体的。有一些 import 方法,但无法弄清楚如何将我现有的密钥与这些方法一起使用。
    • 我现在更新了问题以包含我所有的 python 代码
    • 不确定 jwcrypto 是否支持 A128KW。它在文档中清楚地说明了它,但 JWK 类说:JWKTypesRegistry = {'EC': 'Elliptic Curve', 'RSA': 'RSA', 'oct': 'Octet sequence'} 作为“有效密钥类型的注册表”。令人困惑
    • A128KW 算法需要一个对称密钥,即oct 类型。使用您的密钥 MbPeShVmYq3t6w9z,关联的 JWK 是 {"kty":"oct","k":"MbPeShVmYq3t6w9z"}。您可以使用from_json method 获取有效的对象
    • 请注意参数k应该是Base64Url编码,所以如果它失败了你可以用TWJQZVNoVm1ZcTN0Nnc5eg而不是MbPeShVmYq3t6w9z进行测试=>{"kty":"oct","k":"TWJQZVNoVm1ZcTN0Nnc5eg"}
    猜你喜欢
    • 2020-09-22
    • 2020-11-26
    • 2020-01-08
    • 2020-07-03
    • 2021-04-12
    • 2018-06-01
    • 2017-07-17
    • 1970-01-01
    • 2022-01-11
    相关资源
    最近更新 更多