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

Flutter中使用RSA-OAEP-256和A256GCM加密API请求体的技术咨询

实现RSA-OAEP-256 + A256GCM请求体加密指南

加密流程核心逻辑

你遇到的加密格式是**JWE(JSON Web Encryption)**标准实现,对应头部{"alg":"RSA-OAEP-256","enc":"A256GCM"}的具体步骤如下:

  1. 生成临时对称密钥:随机生成256位AES密钥,用于后续A256GCM加密请求体
  2. 加密对称密钥:用目标网站的RSA公钥,通过RSA-OAEP-256算法加密该AES密钥(仅网站私钥可解密)
  3. 加密原始请求体:用AES密钥+A256GCM算法加密未加密请求体,同时生成12字节初始化向量(IV)和认证标签
  4. 组装JWE字符串:将以下4部分用.拼接,每部分做Base64URL编码(移除末尾=):
    • JWE头部(即{"alg":"RSA-OAEP-256","enc":"A256GCM"})
    • 加密后的AES密钥
    • 初始化向量IV
    • 加密后的请求体+认证标签

关键实现细节

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 11:45:01