You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python生成A256GCM算法JWE遇TS后端解密IV长度错误求助

问题描述

需通过Python使用A256GCM算法加密生成JWE(以JWT形式)发送至Typescript后端,后端解密读取内容。

后端(Typescript)解密代码

import { jwtDecrypt } from 'jose'
result = await jwtDecrypt(request.data, this.key)

Python加密代码

self.key = secrets.token_bytes(32)
self.b64s = base64.b64encode(self.key).decode('utf-8')

data_payload = json.dumps(self.payload)
self.token = jwe.encrypt(data_payload, self.key,
           algorithm='dir', encryption='A256GCM').decode('utf-8')

触发错误

数据传输正常,但后端解密时报错:

JWEInvalid: Invalid Initialization Vector length

已知信息:未手动指定IV,后端无需IV,且当前使用的Python版jose库暂不支持A256GCM算法。


问题分析与解决方案

问题根源

  1. Python库的IV生成不符合标准:JWE规范中A256GCM要求IV长度为12字节(96位),但你使用的Python jose库因不支持A256GCM,生成的IV长度不符合标准,导致后端解密失败。
  2. 算法组合的逻辑不兼容:指定algorithm='dir'+encryption='A256GCM'后,该Python库未正确处理此组合下的IV生成逻辑,输出了非合规的JWE结构。

解决步骤

1. 更换合规的Python加密库

放弃原Python jose库,改用cryptography直接实现符合JWE标准的A256GCM加密,示例代码如下:

import json
import secrets
import base64
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.backends import default_backend

# 生成32字节的A256GCM密钥
key = secrets.token_bytes(32)
b64_key = base64.b64encode(key).decode('utf-8')

# 待加密的 payload
payload = {"user_id": 123, "data": "confidential"}
payload_bytes = json.dumps(payload).encode('utf-8')

# 生成JWE标准要求的12字节IV
iv = secrets.token_bytes(12)

# 初始化AES-GCM加密器
cipher = Cipher(algorithms.AES(key), modes.GCM(iv), backend=default_backend())
encryptor = cipher.encryptor()
ciphertext = encryptor.update(payload_bytes) + encryptor.finalize()
tag = encryptor.tag  # GCM模式必须的认证标签

# 组装符合JWE标准的token(dir算法下encrypted_key字段为空)
protected_header = base64.urlsafe_b64encode(json.dumps({
    "alg": "dir",
    "enc": "A256GCM"
}).encode()).rstrip(b'=').decode('utf-8')
encoded_iv = base64.urlsafe_b64encode(iv).rstrip(b'=').decode('utf-8')
encoded_ciphertext = base64.urlsafe_b64encode(ciphertext).rstrip(b'=').decode('utf-8')
encoded_tag = base64.urlsafe_b64encode(tag).rstrip(b'=').decode('utf-8')

jwe_token = '.'.join([protected_header, "", encoded_iv, encoded_ciphertext, encoded_tag])

2. 确保密钥一致性

后端使用的this.key需与Python生成的密钥完全匹配:若Python传递的是Base64编码后的密钥(即代码中的b64s),后端需用该Base64串解码得到原始字节密钥;若传递原始字节,需保证两端编码一致。

3. 验证JWE结构合规性

生成的JWE必须遵循RFC7516标准,结构为[protected_header].[encrypted_key].[iv].[ciphertext].[tag],其中dir算法下encrypted_key为空字符串。

内容的提问来源于stack exchange,提问作者Matteo Possamai

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:05:10