如何使用火山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 内解密 → 推理 → 加密结果 → 返回
     
    plaintext, encrypt_key = secure_channel_server.decrypt_with_response(encrypted_prompt)
    response = model.generate(plaintext)
    encrypted_response = encrypt_key.encrypt(response)
    return encrypted_response

✅ 整个推理过程在 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)。
 

 

✅ 三、部署流程简要步骤

  1. 在 AICC 控制台发布 Qwen3-VL 开源模型(场景3);
  2. 部署到机密容器,记录服务 IP / 终端节点;
  3. 配置远程证明策略(RAS),获取 ra_policy_id
  4. 准备端侧 SDK
    • 生成签名密钥对(可选);
    • 配置 client_config.json
  5. 准备服务端代码
    • 集成 jsc.Server
    • 在 TEE 中解密 → 推理 → 加密;
  6. 打包服务为容器镜像(可选,如需自定义 API)并部署到 AICC(场景4/5);
  7. 端云联调测试,验证加密通信与推理正确性。
 

 

✅ 四、关键优势

 
项目
保障机制
模型安全
运行在 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)。
  • 流式支持(如果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(可信执行环境)内部解密和处理

  1. 端侧(App): 使用 AICC 提供的 端云互信 SDK。在发送数据前,App 会先验证云端环境是否可信(远程证明),通过后协商出临时会话密钥,将 Prompt 和图片数据加密。

  2. 传输层: 数据以密文形式经过公网、API 网关,到达 AICC 平台。此时无论是黑客还是火山引擎的运维人员,都无法解密数据。

  3. 云侧(TEE): 数据进入 AICC 的机密容器(运行在 CPU/GPU 硬件加密内存中)。容器内的服务使用私钥解密数据,喂给 Qwen3 模型推理。推理结果在 TEE 内再次加密,返回给 App。


具体实施步骤

第一步:云端模型部署(Server 端)

由于使用的是开源 Qwen3,且不需要加密模型文件,你可以使用 模型管理服务(MMS) 或 自定义容器部署。根据文档“典型场景 3【模型部署】开源模型部署”,推荐路径如下:

  1. 发布模型:

    • 进入 AICC 控制台的【模型管理服务】 -> 【发布模型】。

    • 选择 “开源模型”

    • 如果 Qwen3 在下拉列表中直接支持,直接选择;如果不在列表中,你需要将其作为 “私有模型” 上传(参考场景 2,但在使用 model_automation_tool.py 工具时,不设置 -e 参数,即不加密模型文件,只利用 AICC 的容器托管能力)。

  2. 部署模型:

    • 在模型列表中点击【部署】。

    • 规格选择: 由于是 Qwen3 多模态,建议选择 “高级版” 或 “旗舰版”(取决于参数量,文档提示 32B 选高级,671B 选旗舰)。

    • 推理框架: 建议选择 vllm 或 sglang(支持高并发推理)。

    • 部署完成后,你将获得一个运行在 TEE 环境中的服务。

  3. 配置远程证明策略(关键步骤):

    • 为了让 App 信任这个服务,你需要配置 RAS。

    • 进入【远程证明服务】 -> 【创建证明策略】。

    • 关联你刚才部署的模型服务。这将生成一个 ra_policy_id,App 端验证时需要用到,确保 App 连接的是未被篡改的 Qwen3 服务。

  4. 网络打通:

    • 根据文档“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)。

  1. 集成 SDK: 下载对应语言的 Jeddak Secure Channel SDK。

  2. 配置 Client:
    在 App 代码中配置如下信息(参考文档“端云互信 DEMO”):

    codeJSON

     

     

    {
      "ra_url": "pcc.volcengineapi.com",
      "ra_service_name": "你的服务名称",
      "ra_policy_id": "第一步中生成的策略ID",
      "ra_uid": "你的火山账号ID",
      "bytedance_top_info": "{\"ak\": \"...\", \"sk\": \"...\"}" // 生产环境建议使用文档提到的 IAM 降险方案,仅赋予 GetAttestationBackend 权限
    }

     

  3. 实现加密推理逻辑:
    不用直接调用 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 代码里。

  1. 在火山引擎 IAM 中创建一个 子账号

  2. 创建一个自定义权限策略,仅允许 pcc:GetAttestationBackend 接口。

  3. 将此策略绑定给子账号。

  4. 将子账号的 AK/SK 内置到 App 中。这样即使 App 被反编译,泄漏的 AK/SK 也无法操作你的云资源,只能用于建立加密通道。


总结:如何保障隐私?

通过上述方案,你构建了以下信任链:

  1. 代码/环境不可篡改: AICC 的 TEE 环境保证了运行 Qwen3 的内存区域是硬件加密的,云厂商无法通过内存 Dump 获取数据。

  2. 身份互信: App 通过 RAS(远程证明) 校验了云端确实是运行在 TEE 中的 Qwen3,而不是一个钓鱼服务器,才开始发送数据。

  3. 数据隐身: 用户的 Prompt 和图片在手机上加密,只有在 TEE 内部(极短的纳秒级时间内)被解密进 CPU 寄存器/加密内存进行推理,推理完立即销毁明文并加密结果。传输链路和云端存储(日志等)中全是乱码。

推荐注意事项

  • 模型加载: 虽然模型不加密,但为了适配多模态(图片输入),请确保你部署的推理引擎(vLLM 或 SGLang)版本支持 Qwen3 的多模态格式。

  • 接口适配: AICC 的机密容器内部通常会运行一个 Server SDK 的代理(Sidecar),它负责处理解密请求并转发给本地的 vLLM 端口(如 localhost:8000)。如果你使用“开源模型一键部署”,AICC 通常已经预置了这个代理;如果是自定义容器,你需要参考文档中的 example_server.py 写一个简单的 Python 服务来转发流量。

posted @ 2025-12-12 15:36  bonelee  阅读(8)  评论(1)    收藏  举报