如何使用火山AICC实现一个保障用户隐私数据上云的APP?
目标:使用AICC实现一个app,大模型使用开源的qwen3多模态,模型不必加密,然后用户自己的prompt数据可能是图片、文字等敏感内容,我要保障用户隐私,数据在云上不被云厂商窥探,应该如何做?
要基于 火山引擎 Jeddak AICC 实现一个保障用户隐私的 App,使用 开源的 Qwen3 多模态大模型(无需加密模型本身),但保护用户上传的 敏感 Prompt(包括图像、文字等),确保 云上计算过程中数据不被云厂商或其他第三方窥探,你可以按照以下架构和流程进行设计与实施:
✅ 一、核心目标
- 模型本身可公开(开源),无需加密;
- 用户输入(文字 + 图像)属于敏感数据,必须全程加密或在可信环境中处理;
- 云上推理过程必须在可信执行环境(TEE)中完成,防止云厂商或租户间数据泄露;
- 端云之间通信必须加密且可验证身份(端云互信);
- 推理结果返回端侧,仅端侧能解密(若推理结果也含敏感信息)。
✅ 二、推荐方案:“端云互信 + 机密容器 + 开源模型部署”
1. 模型部署阶段(开源模型)
由于模型是 Qwen3 多模态开源模型,可直接使用 典型场景3【开源模型部署】:
- 在 AICC 控制台 > 模型管理服务 中选择“开源模型”;
- 填写模型名称(如
qwen3-vl)、版本等; - 部署时选择合适 AICC 规格(如高级版支持 32B,需确认 Qwen3-VL 实际参数量);
- 推理引擎建议选用
vLLM(基础/高级版支持)或sglang(旗舰版); - AICC 会自动将模型部署到 机密容器(JCK) 中,运行于 TEE(可信执行环境),保障模型运行环境安全。
✅ 模型本身不加密,但 运行环境受 TEE 保护,防止内存窥探。
2. 用户数据保护(Prompt 加密 + 端云互信)
使用 端云互信 SDK(Jeddak Secure Channel) 实现:
▶ 端侧(App/客户端):
- 集成 Python/JS/C++ 等端云互信 SDK;
- 初始化
Client,加载client_config.json(含 RA 策略、AK/SK 降权子账号等); - 对用户 Prompt(文字/图像 Embedding)进行加密:
encrypted_prompt, enc_key = secure_channel_client.encrypt_with_response(prompt)
- 将
encrypted_prompt发送至 AICC 服务端; - 接收服务端返回的 加密推理结果,用
enc_key解密。
🔒 即使云厂商抓包或访问内存,也无法获知明文 Prompt 或结果。
▶ 云侧(AICC 机密容器):
- 服务端集成 端云互信 Server SDK;
- 初始化
Server,加载server_config.json(含 TKS 密钥 ID、公钥验签等); - 接收密文请求后,在 TEE 内解密 → 推理 → 加密结果 → 返回;
✅ 整个推理过程在 TEE 内完成,云平台无法访问明文数据。
3. 安全增强建议
(1) AK/SK 权限最小化(降险)
- 创建 子账号,仅授予
pcc:GetAttestationBackend权限; - 在
client_config.json中使用该子账号的 AK/SK; - 避免主账号泄露导致全量资源风险。
(2) 远程证明(RAS)验证服务可信性
- 在客户端发起请求前,可调用
secure_channel_client.attest_server(); - 验证服务端确实在合法 TEE 中运行(防止中间人或伪造服务);
(3) 多模态数据处理注意事项
- 图像需在端侧转换为模型可接受的输入(如 base64 或 embedding);
- 若图像本身敏感,建议在端侧完成特征提取(如 CLIP 编码),只传 embedding;
- 若必须传原始图像,则需通过
encrypt_with_response加密整个二进制数据; - AICC 服务端需支持多模态输入解析(确保 Qwen3-VL 服务已正确部署并暴露 API)。
✅ 三、部署流程简要步骤
- 在 AICC 控制台发布 Qwen3-VL 开源模型(场景3);
- 部署到机密容器,记录服务 IP / 终端节点;
- 配置远程证明策略(RAS),获取
ra_policy_id; - 准备端侧 SDK:
- 生成签名密钥对(可选);
- 配置
client_config.json;
- 准备服务端代码:
- 集成
jsc.Server; - 在 TEE 中解密 → 推理 → 加密;
- 集成
- 打包服务为容器镜像(可选,如需自定义 API)并部署到 AICC(场景4/5);
- 端云联调测试,验证加密通信与推理正确性。
✅ 四、关键优势
|
项目
|
保障机制
|
|---|---|
|
模型安全
|
运行在 TEE,无需加密模型
|
|
用户数据安全
|
端侧加密 → 云侧 TEE 解密 → TEE 内推理 → 加密返回
|
|
通信安全
|
端云互信 SDK 提供加密通道 + 身份认证
|
|
防云厂商窥探
|
TEE 隔离 + 内存加密 + 远程证明验证
|
|
合规性
|
满足 GDPR、等保等对敏感数据处理的要求
|
如需,我可以为你提供:
client_config.json/server_config.json模板;- 端侧/服务端示例代码(适配 Qwen3-VL 多模态输入);
- 如何申请 AICC 多模态推理所需的 CU 资源建议。
-----------------------------------------
其他补充:
基于你的描述,你想使用火山引擎AICC平台构建一个App,采用开源的Qwen3多模态模型(无需加密模型),但重点保护用户prompt数据(如文本、图片等敏感内容),确保这些数据在云上不被云厂商或其他第三方窥探。AICC正是为此设计的隐私计算平台,它结合TEE(可信执行环境)、加密传输和远程证明等技术,实现端云协作下的数据全链路保护:端侧数据加密传输,云侧在隔离的TEE环境中计算(即使云厂商也无法访问内存数据)。
AICC的核心优势:
- 数据传输安全:使用端云互信SDK加密prompt(支持文本、图片文件),防止传输中泄露。
- 云侧计算安全:模型和服务部署在机密容器(JCK)中,运行于TEE,确保prompt在解密、推理过程中的隐私(云厂商无法窥探)。
- 验证机制:通过远程证明服务(RAS)确认云侧环境可信。
- 多模态支持:Qwen3支持文本+图像prompt,AICC的SDK和容器支持处理多模态数据。
以下是详细步骤指南。假设你已开通AICC服务(如果未开通,联系火山引擎销售)。整个过程无需加密模型本身,只保护用户数据。当前日期是2025年12月12日,文档基于最新版本(2025年更新)。
1. 准备工作
- 账号和资源准备:
- 登录火山引擎控制台,获取你的账号ID(app_id)、API访问密钥(AK/SK)。
- 购买AICC CU(计算单元):根据Qwen3模型大小(假设~32B参数),选择“高级版”规格(支持≤32B模型,月费约29,625元/CU)。实例数量根据负载决定(起步1个)。
- 创建TOS(对象存储)桶(region: cn-beijing),用于临时存储(如图片prompt,如果需要)。
- 创建私有网络(VPC)和子网(至少2个可用区),用于网络配置。
- 下载SDK和工具:
- 下载端云互信SDK(Python版推荐,用于App端和云侧):从文档下载地址获取(version=0.1.7.63)。
- 安装:pip3 install bytedance.jeddak_secure_channel-${version}-py3-none-any.whl。
- 如果App是移动端(iOS/Android),使用C++或Java版SDK;Web端用JS版。
- 模型准备:
- Qwen3是开源模型,无需加密。下载Qwen3多模态模型文件(从Hugging Face或官方源获取),但在AICC中直接选择开源模型发布(无需本地加密)。
- 安全配置:
- 创建可信密钥环和密钥(TKS):在AICC控制台“可信密钥服务”创建密钥环(ring_name自定义),然后创建密钥(类型: SYMMETRIC_256,用途: ENCRYPT_DECRYPT)。记录ring_id和key_id,用于SDK配置。
- 创建远程证明策略(RAS):在“远程证明服务”创建策略(策略内容自动生成,选择Qwen3相关镜像)。记录policy_id,用于验证云侧环境。
2. 部署Qwen3模型到AICC机密容器
使用典型场景3【模型部署】开源模型部署,确保模型运行在TEE中,prompt数据在云侧处理时隐私保护。
- 步骤1: 发布模型
- 进入AICC控制台“模型管理服务”(MMS)。
- 点击“发布模型”,选择“开源模型”类型。
- 填写:模型名称(e.g., Qwen3-Multimodal)、版本(e.g., V1.0)、描述。
- 指定开源模型:选择Qwen3(AICC已支持DeepSeek等类似模型,如果Qwen3未内置,联系管理员添加)。
- 提交发布。状态变为“待部署”。
- 步骤2: 部署模型
- 在模型列表,选择Qwen3模型,点击“部署”。
- 配置:
- AICC规格:高级版(支持Qwen3规模)。
- 推理引擎:vLLM(基础/高级版支持,适合多模态推理;如果旗舰版用sglang)。
- 实例数量:1(可扩展)。
- 服务配置:端口(e.g., 8000,用于推理API)。
- 提交。部署耗时视模型大小(几分钟到小时)。成功后状态变为“已部署”。
- 步骤3: 测试模型可用性
- 点击“测试”,输入简单prompt(e.g., 文本+图片描述),验证推理输出。状态更新为“测试成功”。
- 步骤4: 配置网络和远程证明
- 绑定终端节点:进入“机密容器服务”,复制终端服务名称,创建终端节点(绑定VPC子网、安全组放通端口8000)。
- 获取终端节点IP:用于App连接云侧服务。
- 配置RAS:选择部署的容器,点击“远程证明测试”,验证TEE环境(报告确认代码完整性和安全性)。如果失败,更新策略重试。
这确保Qwen3运行在机密容器中:prompt数据在TEE内解密/处理,云厂商无法访问内存。
3. 集成端云互信SDK保护用户prompt数据
使用SDK实现端侧加密prompt(文本/图片),云侧解密推理,返回加密结果。支持多模态:文本直接加密,图片作为文件加密。
- 云侧(服务端)集成SDK:
- 在机密容器中部署服务代码(使用Python Flask构建推理API)。
- 配置server_config.json(基于TKS密钥):
JSON
{ "tks_url": "pcc.volcengineapi.com", "tks_app_id": "你的app_id", "tks_ring_id": "你的ring_id", "tks_key_id": "你的key_id", "bytedance_top_info": "{\"ak\": \"你的AK\", \"sk\": \"你的SK\", \"service\": \"pcc\"}", "refresh_interval": 3600, "root_key_config": "[{\"app_info\": \"你的app_info\", \"pub_key\":\"./myPublicKey.pem\"}]" // 如需签名验证 } - 加载SDK:secure_channel_server = jsc.Server(jsc.ServerConfig.from_file("server_config.json"))。
- 处理多模态prompt:
- 接收加密prompt:plaintext, encrypt_key = secure_channel_server.decrypt_with_response(encrypted_msg)。
- 对于图片:使用secure_channel_server.decrypt_file(file_enc_key, encrypted_path, output_path, "b")(b for binary)。
- 调用Qwen3推理:输入解密prompt,获取输出。
- 加密返回:encrypted_response = encrypt_key.encrypt(response)。
- 示例代码:参考文档中completion_cipher.py,适配多模态(e.g., /v1/chat/completions接口支持messages with image)。
- 端侧(App)集成SDK:
- 配置client_config.json:
JSON
{ "ra_url": "pcc.volcengineapi.com", "ra_service_name": "你的服务名称", // 从机密容器获取 "ra_policy_id": "你的policy_id", "ra_uid": "你的app_id", "bytedance_top_info": "{\"ak\": \"你的AK\", \"sk\": \"你的SK\", \"service\": \"pcc\"}", "attest_interval": 3600, "root_key_config": "{\"app_info\": \"你的app_info\", \"pub_key\":\"./myPublicKey.pem\"}" // 如需签名 } - 加载SDK:secure_channel_client = jsc.Client(jsc.ClientConfig.from_file("client_config.json"))。
- 加密prompt:
- 文本:encrypted_prompt, enc_key = secure_channel_client.encrypt_with_response(prompt_text)。
- 图片:enc_key = secure_channel_client.encrypt_file("input_image.jpg", "encrypted_image.enc", "b")。
- 发送到云侧API(终端节点IP:8000)。
- 解密响应:plaintext = enc_key.decrypt(encrypted_response)。
- 示例:参考example_client.py,扩展为多模态(发送JSON with text and base64 image)。
- 配置client_config.json:
- 流式支持(如果App需要实时响应):使用SDK的stream方法,加密/解密chunk。
- 签名/验签(可选):如果App端需要身份验证,配置root_key_config,使用gen_sign/verify_sign。
4. 端云联调和测试
- 本地测试:先运行example_server.py和example_client.py,验证加密传输。
- AICC环境测试:部署云侧服务到机密容器,App端连接终端节点IP。发送多模态prompt,检查输出隐私(使用RAS报告确认)。
- RAG保护(如果需要知识库):如果prompt涉及用户私有知识库,使用向量加密服务(创建应用,加密向量存储到密态数据库)。
- 网络打通:使用API网关(可选)暴露公网域名,确保App可访问。
5. 隐私保障验证和注意事项
- 验证TEE安全:定期用RAS测试,下载报告确认无篡改。
- AK/SK降险:为端侧SDK创建子账号,只授予"pcc:GetAttestationBackend"权限(见文档AK/SK降险方案)。
- 性能:加密/解密增加少量延迟(<100ms),TEE不影响Qwen3推理速度。
- 成本:预付费包月,基础资源外无额外加密费。
- 潜在问题:如果图片太大,分块加密;多模态prompt确保Qwen3兼容。
- 扩展:如果需要精调模型,使用端云协作精调场景(加密用户数据精调)。
如果部署中遇到问题(如Qwen3具体集成),提供更多细节或联系火山支持。我可以帮你细化代码示例!
这确保Qwen3运行在机密容器中:prompt数据在TEE内解密/处理,云厂商无法访问内存。=》是如何做到的啊 解密的prompt数据既然在内存 云厂商应该可以看到啊?
TEE(可信执行环境)如何确保云厂商无法访问解密后的prompt数据?
你的疑问很合理:prompt数据在云侧解密后,最终还是会加载到内存中进行处理,云厂商作为硬件/基础设施提供者,难道不能通过操作系统、hypervisor(虚拟化层)或其他特权机制“窥探”内存吗?答案是不能,这是TEE的核心设计原理——通过硬件级隔离和内存加密实现的“机密计算”(Confidential Computing)。即使数据在内存中“明文”处理,云厂商也无法读取它。下面我一步步解释如何做到这一点,基于TEE的标准实现(如Intel SGX或ARM TrustZone,这些是AICC机密容器JCK的基础)。
1. TEE的基本工作机制:隔离的“安全飞地”(Enclave)
- 什么是TEE? TEE是处理器(CPU)内部的一个隔离执行区域,类似于一个“沙箱”,但由硬件强制保护。它将内存分成两个世界:
- 正常世界(Normal World):运行OS、hypervisor、云厂商的管理软件等,一切常规操作。
- 安全世界(Secure World):TEE专属区域,只允许授权代码(如你的Qwen3推理应用)进入。数据在这里解密、处理,但外部无法访问。
- 关键:硬件强制隔离。CPU的架构(如Intel SGX的Enclave或ARM TrustZone的Secure Monitor)会禁止任何更高特权级别的代码(包括云厂商的OS/hypervisor)访问TEE内存。即使云厂商控制整个服务器,他们也只能看到TEE外部的“加密壳”,无法越界。
2. 解密过程:只在CPU内部“瞬时”明文
- 数据进入TEE:端侧(App)用端云互信SDK加密prompt(文本/图片),传输到云侧机密容器。容器收到后,在TEE边界不直接解密——先验证远程证明(RAS),确认环境可信。
- 解密与处理:
- 数据在进入TEE内存(称为Enclave Page Cache, EPC)前被加密存储。
- 当数据需要处理时,CPU的内存加密引擎(如SGX的MEE - Memory Encryption Engine)在CPU内部自动解密:数据从加密形式“飞入”CPU缓存(L1/L2),在核心执行单元中以明文形式计算(e.g., Qwen3模型加载prompt进行推理)。
- 关键点:解密只发生在CPU的私有缓存中,从不暴露到主内存(DRAM)的明文形式。即使主内存部分是EPC(处理器保留内存,PRM),CPU也会实时加密它——读出时加密,写入时解密。这确保了“在用”状态下的保密。
- 输出加密:推理结果在离开TEE前立即加密,返回给端侧。只有端侧的密钥才能解密。
为什么云厂商看不到?
- 云厂商的工具(如监控软件、调试器)运行在Normal World,只能访问非TEE内存。尝试读取TEE内存会触发CPU的硬件异常(e.g., SGX的#GP故障),直接拒绝访问。
- 即使云厂商物理访问服务器,TEE内存区域被CPU“锁死”——PRM(Processor Reserved Memory)是CPU专属,OS/hypervisor无法分配或读取它。
3. AICC机密容器(JCK)中的具体实现
- 在火山引擎AICC中,Qwen3部署到机密容器服务(JCK),这是一个基于TEE的容器化环境(类似Kubernetes Pod,但运行在TEE中)。
- 容器启动:使用TKS(可信密钥服务)生成密钥,RAS(远程证明服务)验证容器镜像的完整性(基线值匹配,确保无篡改)。
- 数据流:prompt经SDK加密进入容器,JCK在TEE内解密(使用容器专属密钥)。Qwen3的推理(如vLLM引擎)在TEE的隔离内存中运行,云侧日志/监控看不到prompt内容。
- 保护层级:
- 传输:端云互信SDK(基于TrustZone或SGX)加密通道。
- 存储:prompt暂存时加密(TOS桶可选)。
- 计算:TEE确保内存不可读——云厂商的运维人员/软件无法dump内存或侧信道攻击(AICC有缓解措施,如随机化)。
- 如果是ARM TrustZone(常见于云服务器),它通过安全监视器动态切换世界,确保Secure World内存不可从Normal World访问。
4. 潜在局限与额外保障
- 不是100%无懈可击:TEE防不住侧信道攻击(如缓存时序攻击),但AICC通过噪声注入、缓存分区等缓解。文档中提到,TEE针对软件攻击(如云厂商恶意代码)设计,对物理攻击(如冷启动)需额外措施。
- 验证信任:每次会话,App端用RAS报告确认TEE环境(哈希匹配),证明“云侧确实是可信的Qwen3容器”。
- 为什么可靠? 这是硬件根信任(Root of Trust):Intel/ARM等厂商的固件签名确保TEE不可伪造。即使云厂商想“改代码”,CPU会拒绝启动。
总之,TEE不是简单“加密内存”,而是CPU硬件重新定义访问权限:解密数据“活在”CPU的封闭世界里,云厂商的“眼睛”被挡在门外。这就是机密计算的本质,让你能在公有云上放心跑敏感AI任务。如果你想深入某个TEE(如SGX)的代码示例或AICC配置,我可以进一步解释! 😊
推理结果在离开TEE前立即加密,返回给端侧。只有端侧的密钥才能解密。==》端侧解密是用什么啊?
端侧解密的密钥来自端云互信SDK在建立安全通道时协商出的“会话密钥”(Session Key),而不是你手动管理的某个固定密钥。下面是完整、清晰的密钥流转过程(以火山引擎 Jeddak AICC 实际使用的机制为例):
1. 第一次建立连接时:端侧和云侧 TEE 共同生成“会话密钥”
| 步骤 | 发生在哪里 | 具体做了什么 | 结果 |
|---|---|---|---|
| 1 | 端侧(你的 App) | SDK 调用 secure_channel_client.attest_server() 发起远程证明(RA) | 向云侧 TEE 请求“证明报告 + 云侧 TEE 的公钥” |
| 2 | 云侧 TEE(机密容器) | TEE 生成一个临时的 ECDH 密钥对(比如 secp384r1),把公钥塞进远程证明报告里,用 TKS(可信密钥服务)的私钥签名后返回 | 证明“我真的是火山官方的 TEE,而且我给你一个新鲜公钥” |
| 3 | 端侧 | SDK 验证远程证明报告通过后,自己也生成一个临时的 ECDH 密钥对 | 端侧拿到云侧 TEE 的临时公钥 |
| 4 | 端侧 ↔ 云侧 TEE | 双方做 ECDH 密钥交换(Diffie-Hellman) | 双方在各自的 TEE/安全环境中算出完全相同的共享秘密(Shared Secret) |
| 5 | 端侧 & 云侧 | 各自把 Shared Secret 通过 HKDF 派生出一组对称密钥(通常是 AES-256-GCM 的加密密钥 + HMAC 密钥) | 这组对称密钥就是真正的“会话密钥”(Session Key) |
这个会话密钥只存在于端侧内存 + 云侧 TEE 内存,从不在磁盘、日志、任何明文位置出现。
2. 后续所有通信都用这把“会话密钥”
- 端侧要发 prompt: encrypted_msg, enc_key = secure_channel_client.encrypt_with_response(prompt) → enc_key 就是上面协商出来的那把会话密钥的对象(SDK 内部持有)。
- 云侧收到密文后: plaintext, encrypt_key = secure_channel_server.decrypt_with_response(encrypted_msg) → 云侧 TEE 用同一把会话密钥解密。
- 云侧返回推理结果: encrypted_response = encrypt_key.encrypt(result) → 还是同一把会话密钥加密。
- 端侧收到后: plaintext = enc_key.decrypt(encrypted_response) → 用端侧保存的那把完全相同的会话密钥解密。
3. 端侧到底用“什么”解密?
答案就是:端侧 SDK 内部持有的那把 ECDH 派生出来的 AES-256-GCM 会话密钥。
你代码里看到的 enc_key(类型是 bytedance.jeddak_secure_channel.EncryptKey)就是这把密钥的句柄,它:
- 永远不会被序列化到磁盘
- 永远不会以明文形式打印
- 会话结束或超时后自动销毁
- 下一次连接会重新协商一把全新的会话密钥(前向安全性)
4. 一句话总结
端侧解密用的密钥 = 本次会话与云侧 TEE 通过远程证明 + ECDH 密钥交换协商出的临时对称会话密钥,这把密钥只存在于端侧内存和云侧 TEE 内存中,火山引擎(包括运维人员)完全无法获取。
所以你完全不需要自己管理什么“解密私钥”,SDK 全程自动化完成,整个过程符合标准的机密计算安全通道协议(类似 TLS 1.3 的会话密钥协商,但跑在 TEE 里,比普通 TLS 更强)。
gemini 3的回答:
根据你提供的文档和需求,你想利用火山引擎 Jeddak AICC 平台开发一个 App,使用 开源的 Qwen3 多模态大模型,不需要对模型文件加密,但必须 绝对保障用户输入(Prompt、图片等敏感数据)的隐私,防止云厂商或第三方窥探。
这是一个非常典型的 端云互信(End-to-Cloud Mutual Trust) + 机密计算(TEE) 的应用场景。
以下是基于文档整理的实现方案和操作步骤:
核心架构原理
要实现“云厂商也无法查看数据”,核心在于 数据仅在 TEE(可信执行环境)内部解密和处理。
-
端侧(App): 使用 AICC 提供的 端云互信 SDK。在发送数据前,App 会先验证云端环境是否可信(远程证明),通过后协商出临时会话密钥,将 Prompt 和图片数据加密。
-
传输层: 数据以密文形式经过公网、API 网关,到达 AICC 平台。此时无论是黑客还是火山引擎的运维人员,都无法解密数据。
-
云侧(TEE): 数据进入 AICC 的机密容器(运行在 CPU/GPU 硬件加密内存中)。容器内的服务使用私钥解密数据,喂给 Qwen3 模型推理。推理结果在 TEE 内再次加密,返回给 App。
具体实施步骤
第一步:云端模型部署(Server 端)
由于使用的是开源 Qwen3,且不需要加密模型文件,你可以使用 模型管理服务(MMS) 或 自定义容器部署。根据文档“典型场景 3【模型部署】开源模型部署”,推荐路径如下:
-
发布模型:
-
进入 AICC 控制台的【模型管理服务】 -> 【发布模型】。
-
选择 “开源模型”。
-
如果 Qwen3 在下拉列表中直接支持,直接选择;如果不在列表中,你需要将其作为 “私有模型” 上传(参考场景 2,但在使用 model_automation_tool.py 工具时,不设置 -e 参数,即不加密模型文件,只利用 AICC 的容器托管能力)。
-
-
部署模型:
-
在模型列表中点击【部署】。
-
规格选择: 由于是 Qwen3 多模态,建议选择 “高级版” 或 “旗舰版”(取决于参数量,文档提示 32B 选高级,671B 选旗舰)。
-
推理框架: 建议选择 vllm 或 sglang(支持高并发推理)。
-
部署完成后,你将获得一个运行在 TEE 环境中的服务。
-
-
配置远程证明策略(关键步骤):
-
为了让 App 信任这个服务,你需要配置 RAS。
-
进入【远程证明服务】 -> 【创建证明策略】。
-
关联你刚才部署的模型服务。这将生成一个 ra_policy_id,App 端验证时需要用到,确保 App 连接的是未被篡改的 Qwen3 服务。
-
-
网络打通:
-
根据文档“AICC 网络链路打通使用说明”,你需要创建 终端节点(Endpoint) 绑定你的机密容器服务。
-
购买 API 网关,配置路由指向该终端节点,从而获得一个公网可访问的 API 地址(如 https://api.your-gateway.com/v1/chat/completions)。
-
第二步:App 端开发(Client 端)
你需要将 AICC 的 SDK 集成到你的 App 中(文档支持 Python/C++/Java/JS,如果是移动端 App,可能需要使用 C++ SDK 封装或 JS/Java SDK)。
-
集成 SDK: 下载对应语言的 Jeddak Secure Channel SDK。
-
配置 Client:
codeJSON
在 App 代码中配置如下信息(参考文档“端云互信 DEMO”):{ "ra_url": "pcc.volcengineapi.com", "ra_service_name": "你的服务名称", "ra_policy_id": "第一步中生成的策略ID", "ra_uid": "你的火山账号ID", "bytedance_top_info": "{\"ak\": \"...\", \"sk\": \"...\"}" // 生产环境建议使用文档提到的 IAM 降险方案,仅赋予 GetAttestationBackend 权限 } -
实现加密推理逻辑:
不用直接调用 OpenAI 格式的 API,而是通过 SDK 包裹一层。-
远程证明: SDK 启动时会自动校验云端 RAS 报告(确保云端跑的是正版 Qwen3 且环境安全)。
-
数据加密: 你的 App 获取用户输入的文字和图片(转为 Base64 或 Bytes),构建 payload。
-
调用代码示例(伪代码):
codePython# 1. 准备数据 payload = { "model": "qwen3-multimodal", "messages": [ {"role": "user", "content": [ {"type": "text", "text": "分析这张图片"}, {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}} ]} ] } # 2. 加密 (SDK 自动处理密钥协商) # 这里的 secure_channel_client 已经完成了对云端的身份验证 encrypted_payload, enc_key = secure_channel_client.encrypt_with_response(json.dumps(payload)) # 3. 发送 HTTP 请求 (完全密文传输) response = requests.post(gateway_url, json={"enc_msg": encrypted_payload}) # 4. 解密响应 # 只有持有当前会话密钥的 App 能解密 result = enc_key.decrypt(response.json()['data']) print("模型回答:", result)
-
第三步:AK/SK 安全处理(最佳实践)
文档特意提到了 “AK/SK 降险方案”,这对于 App 开发至关重要,因为你不能把主账号的 AK/SK 放在 App 代码里。
-
在火山引擎 IAM 中创建一个 子账号。
-
创建一个自定义权限策略,仅允许 pcc:GetAttestationBackend 接口。
-
将此策略绑定给子账号。
-
将子账号的 AK/SK 内置到 App 中。这样即使 App 被反编译,泄漏的 AK/SK 也无法操作你的云资源,只能用于建立加密通道。
总结:如何保障隐私?
通过上述方案,你构建了以下信任链:
-
代码/环境不可篡改: AICC 的 TEE 环境保证了运行 Qwen3 的内存区域是硬件加密的,云厂商无法通过内存 Dump 获取数据。
-
身份互信: App 通过 RAS(远程证明) 校验了云端确实是运行在 TEE 中的 Qwen3,而不是一个钓鱼服务器,才开始发送数据。
-
数据隐身: 用户的 Prompt 和图片在手机上加密,只有在 TEE 内部(极短的纳秒级时间内)被解密进 CPU 寄存器/加密内存进行推理,推理完立即销毁明文并加密结果。传输链路和云端存储(日志等)中全是乱码。
推荐注意事项
-
模型加载: 虽然模型不加密,但为了适配多模态(图片输入),请确保你部署的推理引擎(vLLM 或 SGLang)版本支持 Qwen3 的多模态格式。
-
接口适配: AICC 的机密容器内部通常会运行一个 Server SDK 的代理(Sidecar),它负责处理解密请求并转发给本地的 vLLM 端口(如 localhost:8000)。如果你使用“开源模型一键部署”,AICC 通常已经预置了这个代理;如果是自定义容器,你需要参考文档中的 example_server.py 写一个简单的 Python 服务来转发流量。

浙公网安备 33010602011771号