Flutter中使用RSA-OAEP-256和A256GCM加密API请求体的技术咨询
实现RSA-OAEP-256 + A256GCM请求体加密指南
加密流程核心逻辑
你遇到的加密格式是**JWE(JSON Web Encryption)**标准实现,对应头部{"alg":"RSA-OAEP-256","enc":"A256GCM"}的具体步骤如下:
- 生成临时对称密钥:随机生成256位AES密钥,用于后续A256GCM加密请求体
- 加密对称密钥:用目标网站的RSA公钥,通过RSA-OAEP-256算法加密该AES密钥(仅网站私钥可解密)
- 加密原始请求体:用AES密钥+A256GCM算法加密未加密请求体,同时生成12字节初始化向量(IV)和认证标签
- 组装JWE字符串:将以下4部分用
.拼接,每部分做Base64URL编码(移除末尾=):- JWE头部(即
{"alg":"RSA-OAEP-256","enc":"A256GCM"}) - 加密后的AES密钥
- 初始化向量IV
- 加密后的请求体+认证标签
- JWE头部(即
关键实现细节
1. 获取目标网站RSA公钥
公钥获取渠道通常有三种:
- 查阅目标API官方文档,加密/认证章节一般会提供公钥或获取地址
- 访问网站
/.well-known/jwks.json端点(若遵循OIDC标准),提取RSA公钥条目 - 抓包分析网站前端请求,查看初始化阶段是否通过接口或页面脚本返回公钥
2. Python代码实现示例
import json import base64 import os from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives import hashes, serialization from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes from cryptography.hazmat.backends import default_backend # 原始未加密请求体 raw_payload = [ { "operationName": "UserReservations", "variables": {}, "query": "query UserReservations {\n userReservation {\n variantId\n quantity\n id\n user\n __typename\n }\n}\n}" } ] payload_bytes = json.dumps(raw_payload).encode('utf-8') # 加载目标网站RSA公钥(替换为实际公钥PEM内容) public_key_pem = b"""-----BEGIN PUBLIC KEY----- # 替换为实际公钥内容 -----END PUBLIC KEY-----""" public_key = serialization.load_pem_public_key(public_key_pem, backend=default_backend()) # 1. 生成AES-256密钥和GCM IV(GCM推荐12字节IV) aes_key = os.urandom(32) iv = os.urandom(12) # 2. 用A256GCM加密请求体 cipher = Cipher(algorithms.AES(aes_key), modes.GCM(iv), backend=default_backend()) encryptor = cipher.encryptor() ciphertext = encryptor.update(payload_bytes) + encryptor.finalize() tag = encryptor.tag # GCM认证标签 # 3. 用RSA-OAEP-256加密AES密钥 encrypted_aes_key = public_key.encrypt( aes_key, padding.OAEP( mgf=padding.MGF1(algorithm=hashes.SHA256()), algorithm=hashes.SHA256(), label=None ) ) # 4. 组装JWE格式 def base64url_encode(data): return base64.urlsafe_b64encode(data).rstrip(b'=').decode('utf-8') jwe_header = base64url_encode(json.dumps({"alg":"RSA-OAEP-256","enc":"A256GCM"}).encode()) encrypted_key_part = base64url_encode(encrypted_aes_key) iv_part = base64url_encode(iv) ciphertext_tag_part = base64url_encode(ciphertext + tag) jwe = f"{jwe_header}.{encrypted_key_part}.{iv_part}.{ciphertext_tag_part}" print(jwe)
3. 结果验证
生成的JWE结构需与你提供的示例完全一致:
- 第一部分固定为头部编码:
eyJhbGciOiJSU0EtT0FFUC0yNTYiLCJlbmMiOiJBMjU2R0NNIn0 - 后续三部分分别对应加密密钥、IV、密文+标签的Base64URL编码
技术规范依据
- JWE标准:遵循RFC 7516,定义JSON Web Encryption的格式与加密流程
- RSA-OAEP-256:来自RFC 3447,使用SHA-256作为哈希函数的RSA加密算法
- A256GCM:参考NIST SP 800-38D,AES的GCM模式,提供加密+认证双重保障
内容的提问来源于stack exchange,提问作者Ernesto Enrique Sanchez
相关产品推荐
相关产品推荐

