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算法。
问题分析与解决方案
问题根源
- Python库的IV生成不符合标准:JWE规范中A256GCM要求IV长度为12字节(96位),但你使用的Python jose库因不支持A256GCM,生成的IV长度不符合标准,导致后端解密失败。
- 算法组合的逻辑不兼容:指定
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
相关产品推荐
相关产品推荐

