python - 无法找到使用 jwcrypto 在 python 中解密 JWE token (但在 ASP.Net 中创建)的方法

标签 python asp.net encryption jwt

使用 ASP.Net 加密 JWE token 后,我在用 Python 解密 JWE token 时遇到困难。

这是我的 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);

使用加密凭证时, token 看起来像这样(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/"
    }
}

这是加密后的 token :

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

我尝试了几个不同的 python 软件包,包括 2 个版本的 jose(python-josejose),但无法让 jose 与加密一起使用(好像不支持A128KW算法)。

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

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-jose不支持JWE。在他们的online documentation中或in the source code我找不到任何与 JWE 解析或加密/解密相关的代码行。

希望在 jwt.io 的库列表中,我找到了 jwcrypto应该支持这样的加密 token (参见 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

关于python - 无法找到使用 jwcrypto 在 python 中解密 JWE token (但在 ASP.Net 中创建)的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54633115/

相关文章:

Python:检查两个变量之间相同类型的最佳方法

python - 我在哪里放置 python 库文件夹?

javascript - 通过 asp.net 在 javascript 中打开多个弹出窗口

c# - 需要在 Response.Redirect 之前调用客户端脚本。有什么建议么?

encryption - 加密和密码是不同的东西吗?

c# - 解密AES密文

apache - 在 Apache 上设置 ECDSA 并获取 SSL_ERROR_NO_CYPHER_OVERLAP

python - 谁能帮我理解 Python 变量作用域?

asp.net - 适合 ASP.NET 开发(兼容浏览器 UI)的良好 UI 单元测试解决方案?

python - TF/keras 子类在 Eager Execution 中完美工作,并且在没有它的情况下抛出巨大的无法追踪的错误?