python - 找不到使用 jwcrypto 在 python 中解密 JWE 令牌(但在 ASP.Net 中创建)的方法
问题描述
使用 ASP.Net 加密后,我很难在 python 中解密我的 JWE 令牌。
这是我的 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
,但似乎希望我生成一个新密钥而不是使用我现有的密钥(用于在 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-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
推荐阅读
- facebook - ios 中的 Facebook 帐户工具包本地化问题
- reactjs - React 中的按钮提交结果为 404
- excel - 如何根据Excel VBA中另一列的编号在Excel中插入/复制
- php - 如何在 PHP 中使用特定字体生成条形码
- c# - ComboBox 绑定来自 MVVM C# 中两个不同类的两个不同属性
- node.js - 从节点接收错误 json 格式的数据
- c# - 反序列化没有名称的对象的 JSON 数组时应用程序崩溃
- python - Python Paramiko 使用变量执行命令
- automated-tests - 时间失败问题 - Katalon
- regex - 由于未知错误,嵌套括号的动态正则表达式失败