先看结论与判断条件

  • 先分别盘点模型、推理运行时、预后处理逻辑、提示模板、API 凭据、缓存、日志和服务端资源。
  • 文件加密保护静态存储阶段,模型加载后的运行状态、调用接口和输出仍需单独控制。
  • 长期高权限 API Key 不应作为客户端秘密,优先使用服务端代理、短期令牌、最小权限和可撤销策略。
  • Play Integrity 与 App Attest 可以提供应用实例或环境证据,但最终授权和风险处置仍在服务端。

先把移动 AI 应用拆成七类资产

移动 AI 安全经常被简化成模型有没有加密。实际攻击面至少包含模型文件、推理运行时、输入预处理、输出后处理、提示或业务规则、远端 API 凭据、用户数据与日志。每类资产的泄露后果、更新方式和责任人不同。

模型权重被复制可能造成知识产权和业务能力外泄;提示模板或后处理逻辑被修改可能改变业务行为;长期 API Key 泄露可能直接产生费用、数据访问或资源滥用;输入输出日志则可能包含用户隐私。只保护模型文件,不能覆盖其余风险。

资产表应记录存放位置、生成来源、传输路径、运行时使用方式、更新和回滚机制、最小权限、日志范围与保留周期。无法说明生命周期的资产,不应仅靠一个加密开关获得已保护结论。

移动 AI 应用资产与主要控制
资产主要风险优先控制不能由什么替代
模型文件复制、静态分析、版本替换受控交付、文件保护、完整性和版本配对接口鉴权
推理运行时注入、调试、内存观察和依赖风险运行时加固、依赖治理、异常与兼容验证只给模型文件加密
预后处理逻辑规则被还原或修改关键路径保护、服务端复核和回归模型权重保护
API 凭据滥用、费用和数据越权服务端代理、短期令牌、限权和轮换代码混淆或模型加密
用户输入输出隐私泄露、注入和敏感信息回显最小收集、过滤、脱敏和访问控制设备加密的泛化承诺
日志与缓存长期留存敏感材料分类、脱敏、过期和受控导出关闭一个调试开关
服务端资源未授权调用和自动化滥用账号、额度、行为、版本与完整性策略客户端自报可信

模型文件在运行时必须变成可用材料

无论使用 Core ML、LiteRT 或其他端侧运行时,模型都要被加载、解析并参与计算。文件层加密可以减少从安装包或应用目录直接复制的便利性,却不能让运行中的应用不接触模型材料。攻击者若能够控制进程或观察运行时,风险模型会从静态文件转向加载、内存、调用和输出。

这并不说明模型加密没有价值。它能减少低成本复制、阻止直接替换,并与包体保护、完整性、运行环境检测和版本配对形成纵深防御。关键是把结论写成提高成本和缩小暴露面,而不是无法提取。

模型更新还会引入兼容问题。模型版本必须与预处理、特征形状、运行时版本、硬件能力和后处理规则配对。更新失败时需要安全回滚,不能让旧模型与新逻辑随机组合。

模型生命周期各阶段的控制目标
阶段暴露面控制重点验证问题
构建与打包仓库、CI、安装包和资源目录访问控制、密钥隔离、文件保护和产物身份最终包中出现了哪些模型和配置
下载与更新网络、缓存和版本切换传输保护、签名或完整性、原子替换和回滚异常更新是否会加载不匹配模型
加载与推理进程内存、运行时接口和硬件后端运行时保护、最小驻留、异常处理和兼容模型何时可用,失败如何停止
输出与日志结果、置信度、调试信息和用户数据最小输出、脱敏、访问控制和过期日志是否泄露模型或用户敏感信息

长期高权限 API Key 不应成为客户端秘密

Android 安全文档明确指出,应用被编译后,源码中的 API Key 可能通过反编译被发现。混淆和加固可以增加定位成本,却不能改变客户端必须持有和使用该凭据的事实。只要密钥在通用客户端中长期有效且权限很高,泄露后的影响就难以限制。

Android Keystore 可以让某些密钥材料保持不可导出,但官方也说明,当应用进程被攻破时,攻击者可能仍然能够使用应用的密钥执行操作。它适合保护设备绑定的私钥和本地加密,不应被误解为可以安全存放任意远端服务的长期共享密钥。

更稳妥的架构是让客户端通过用户身份和设备上下文向自有服务申请短期、限权、可撤销的令牌,或者由服务端代理高风险模型调用。服务端实施账号授权、额度、速率、模型范围、数据范围和异常行为监控。

  • 凭据按开发、测试和生产隔离
  • 令牌具有最小模型和数据权限
  • 服务端可撤销并限制额度与速率
  • 客户端不保存长期高权限共享密钥
服务端令牌决策的公开安全伪代码
request = verify_user_session(input.session)
app = verify_app_evidence(input.attestation)
policy = load_policy(user=request.user, app=app.identity)

if policy.version_state == UNKNOWN:
    return CHALLENGE_OR_LIMIT
if policy.account_scope.allows(input.model_scope) == false:
    return DENY
if policy.risk_score >= HIGH:
    return STEP_UP_VERIFICATION

return issue_short_lived_token(
    scope=input.model_scope,
    quota=policy.quota,
    expires_in=policy.short_window
)

完整性信号只能参与服务端决策

Play Integrity 可以为 Android 后端提供应用识别、设备完整性、账号许可和部分环境风险信号。Apple App Attest 通过设备生成密钥、一次性挑战、服务端验证 attestation 和后续 assertion,帮助服务端判断请求是否来自有效应用实例。两者的共同点是证据最终由服务端验证。

这些机制也有明确边界。Play 相关信号受分发来源、设备和服务状态影响;Apple 文档说明 App Attest 并非所有设备类型都支持,而且单一策略不能消除所有欺诈。服务端应区分通过、失败、不可用、暂时错误和未配置,不应把不可用直接等同攻击,也不应在客户端本地完成最终判定。

完整性信号与模型加密解决不同问题。前者帮助验证应用实例和运行环境,后者降低模型静态暴露。真正的授权仍需要账号、业务资源、版本、请求内容、额度和行为上下文。

信号到决策的职责分离
层提供什么由谁验证常见误用
模型文件保护静态存储和替换阻力客户端与交付链把文件加密当成接口授权
Play IntegrityAndroid 应用、设备、账号和环境相关信号服务端客户端自己返回可信布尔值
App AttestApple 应用实例密钥的 attestation 与 assertion服务端忽略 challenge、计数器或不支持设备
账号与业务策略用户是否能访问特定模型、数据和额度服务端只看设备信号不看用户权限
行为风控速率、重放、批量滥用和异常上下文服务端一次通过后永久信任

验证移动 AI 应用要同时看静态、运行和服务端

静态检查回答安装包里有哪些模型、配置、字符串、凭据和调试资源;运行检查回答模型如何加载、失败如何处理、日志是否泄露、更新能否回滚;服务端检查回答账号、版本、完整性、额度和数据权限是否真正生效。三类证据缺一类,结论都会偏向局部。

测试应使用唯一候选包和明确模型版本,记录目标系统、设备能力、运行时后端、模型来源和更新状态。端侧推理的性能、内存和兼容性与模型结构、量化、硬件和运行时有关,不能引用其他模型或设备的数字。

异常路径尤其重要:模型文件缺失或损坏、更新中断、运行时不支持、服务端令牌过期、完整性信号不可用、日志上传失败、用户撤回权限。系统必须安全降级,并且给用户和运维可恢复的状态。

移动 AI 安全验证矩阵
证据面检查内容通过条件结论边界
安装包静态面模型、密钥、配置、日志标记和调试资源无长期高权限秘密,模型交付符合设计不能证明运行时不可观察
模型运行面加载、内存生命周期、错误、性能和回滚目标设备稳定且异常安全不能证明服务端授权正确
网络与凭据令牌时效、权限、轮换、重放和证书策略最小权限且可撤销不能证明模型文件受保护
服务端策略账号、版本、完整性、额度和行为高风险资源由服务端最终决定不能把单一平台信号当绝对可信
隐私与日志输入输出、缓存、诊断和导出最小收集、脱敏和可过期需结合业务数据分类要求

设计结论与不能承诺的范围

模型加密值得做,但它属于模型生命周期中的一个控制点。商业 AI App 还需要保护预后处理逻辑、避免长期高权限密钥进入客户端、让服务端完成最终授权、对平台完整性信号做容错,并治理用户数据和日志。

没有真实候选包、模型版本、目标设备和服务端接口时,只能评审架构和待验证项,不能声称模型防提取、接口防滥用、运行时注入阻断或性能通过。任何此类结论都需要当前证据包。

御盾在本页的行动入口用于申请 App 加固与兼容性评估,不代表已经验证某个模型框架或某项 AI 专属能力。项目范围应在提交技术栈、模型交付方式和关键业务路径后单独确认。

  • 模型、运行时、凭据和数据分别建账
  • 高风险调用由服务端最终授权
  • 平台信号具有不可用和降级路径
  • 模型更新可以校验、原子切换和回滚
  • 所有结论绑定候选包与模型版本

模型更新要有签名、原子切换和回滚

端侧模型常通过安装包、首次下载、增量更新或业务资源包交付,不同路径的信任起点不同。更新服务应返回模型标识、适用运行时、文件大小、摘要、签名、最低应用版本和失效时间;客户端先在隔离目录完成下载与校验,再加载一次并执行最小自检,全部通过后才原子切换当前版本。直接覆盖正在使用的文件,会让网络中断、空间不足或进程并发读取变成难以复现的半更新状态。

摘要只能发现内容变化,不能独自证明发布者身份;签名验证需要把可信公钥或证书策略放在可维护的位置,并考虑密钥轮换和撤销。应用自身被重打包时,本地验证逻辑也可能遭到修改,因此高风险模型更新还应由服务端结合账号、版本和应用完整性证据决定是否下发。这里的目标是建立可追溯链路,而不是宣称客户端能够形成绝对可信根。

回滚必须在上线前演练。新模型可能文件格式正确,却在某个硬件后端、量化算子、内存条件或预后处理版本上输出异常;客户端应保留最近一个已知可用版本、失败计数和切换原因,并避免在启动循环中反复下载同一个坏版本。业务指标报警只能作为发现信号,最终回滚判断仍需绑定具体模型、运行时、应用候选和设备范围。

模型与预处理代码必须按兼容组合发布。词表、归一化参数、输入尺寸、标签映射或后处理阈值变化,即使模型文件本身可以加载,也可能让业务输出完全失真。清单中应包含协议版本,客户端拒绝自己不理解的组合;灰度记录同时带上模型版本和应用版本,才能判断异常来自模型、运行时还是调用逻辑,而不是笼统归类为 AI 效果波动。

下载缓存不能只按文件名判断命中。相同名称可能对应不同版本,断点续传也可能留下旧分片;应以清单中的摘要和大小确认完整文件,校验失败就隔离并重新获取。清理旧版本时要避开仍被推理线程引用的文件,并在存储空间不足时优先保留当前可用与回滚版本,不能为新下载先删掉唯一稳定副本。

  • 模型清单包含摘要、签名和兼容版本
  • 下载在隔离目录完成
  • 加载自检通过后原子切换
  • 签名密钥具备轮换和撤销路径
  • 保留最近一个已知可用版本
  • 失败不会触发无限下载循环

凭据、输入和日志必须按生命周期治理

移动 AI 功能的风险经常不在模型文件本身,而在调用链周围。语音、图片、文档、提示词、向量缓存和模型输出可能包含账号资料或业务秘密;调试日志、崩溃附件和埋点如果原样记录输入输出,会把原本受权限控制的数据复制到更多系统。设计时应明确每类数据由谁产生、在端上保留多久、是否上传、服务端如何删除以及支持人员能看到什么,而不是统一贴上已加密标签。

访问后端模型服务时,客户端应先以用户会话和应用实例换取短期、窄权限凭据,服务端再验证账号范围、应用版本、请求资源和风险信号。凭据过期、撤销、离线和时钟异常都需要显式路径;把长期供应商 Key 藏进 Native 库或模型资源,只改变提取难度,没有改变所有安装实例共享同一高权限秘密的架构问题。

日志策略要能支持故障定位又避免复刻敏感数据。推荐记录请求标识、模型版本、运行后端、耗时区间、错误类别和脱敏后的输入尺寸,不记录完整提示词、图片字节、访问令牌或模型明文。需要临时采样时采用显式开关、短保留期和访问审计,并在支持工单关闭后删除。公开文章只能描述治理方法,不能用未经授权的真实请求或用户数据充当案例。

离线功能要提前定义授权降级,而不是简单延长凭据寿命。能够完全离线执行的低风险能力可以使用本地许可和到期窗口,高风险付费或账号决策则需要明确无网络时拒绝、限额或只读。设备时间可被修改,单靠本地日期不能形成可靠期限;设计应结合最近一次可信服务端状态、单调计数和恢复连接后的复核,并允许合法用户在误判时恢复。

撤销路径要覆盖账号、设备、应用版本和具体模型权限。用户退出登录只清除界面状态而保留可调用令牌,会让共享设备继续访问;模型权限到期但缓存文件仍可由业务入口加载,也会形成边界不一致。注销、换号、风险冻结、版本撤回和卸载重装都应进入测试矩阵,并确认服务端不再接受旧凭据。

移动 AI 数据与凭据的生命周期控制
对象端侧处理服务端责任失效或删除
用户输入最小化缓存并隔离权限按目的处理和访问审计任务完成或用户请求后删除
模型输出按业务敏感度展示和保存执行内容与账号策略过期、撤回或版本替换
短期凭据只存受限作用域和有效期签发、校验、撤销和限流到期或风险事件立即失效
模型文件校验后原子加载管理版本、签名和下发资格撤销坏版本并安全清理
诊断日志默认不记录原始内容脱敏、限权和审计短保留期自动删除
  • 长期供应商密钥不进入客户端
  • 凭据具有作用域、有效期和撤销
  • 输入输出按数据类别定义保留期
  • 日志默认不复制原始敏感内容
  • 临时采样具有开关和访问审计

事实依据与适用边界

以下内容区分官方事实、本文工程判断和不能外推的范围,避免把设计建议写成未经验证的产品结论。

本文判断事实或工程依据适用限制
编译进客户端的 API Key 可能被反编译发现。Android 官方安全清单直接说明源码包含 API Key 时,攻击者可能反编译应用并找到这些资源。部分平台限制型低权限 Key 可以按供应商规则放在客户端,但仍需限制范围和监控。
Android Keystore 不能让被攻破进程失去使用密钥的能力。Android 官方说明密钥材料可保持不可导出,但应用进程被攻破时攻击者可能仍能使用应用的密钥。具体保护能力取决于密钥用途、硬件支持、认证约束和实现。
App Attest 的证明和 assertion 必须在服务端验证。Apple 官方流程使用服务端 challenge、attestation 验证、保存公钥和后续 assertion 计数器。并非所有设备类型都支持,且 Apple 明确单一策略不能消除所有欺诈。
模型文件保护不能替代服务端资源授权。两者保护对象不同:一个面向客户端文件和运行材料,一个面向账号、模型、数据和额度权限。这是架构职责判断,不代表任何特定模型加密实现已经通过。
端侧模型性能和兼容结论必须绑定模型与设备。模型结构、量化方式、运行时、硬件后端、系统版本和输入规模共同影响结果。本文没有提供或暗示御盾的模型性能数字。

工程常见问题

模型已经加密,为什么还不能把 API Key 放在 App 里?

模型加密保护模型文件,API Key 是访问远端资源的凭据。客户端必须使用该 Key 时,攻击者仍可能通过静态或运行观察获得或滥用它。

把 API Key 存到 Android Keystore 就绝对安全吗?

Keystore 可以减少密钥材料被导出,但被攻破的应用进程可能仍能调用密钥。它更适合设备绑定操作,不替代服务端最小权限和短期令牌。

Play Integrity 或 App Attest 通过后可以永久信任设备吗?

不可以。它们提供特定时间和上下文中的证据,服务端仍需验证账号、请求、版本、额度和行为,并处理信号不可用与状态变化。

端侧模型是否一定要迁移到服务端?

不一定。离线、隐私和低时延场景可能需要端侧推理。应根据资产价值和业务条件分层,并把高风险权限与长期秘密留在服务端。

没有模型样本时能做什么评估?

可以评审资产、交付链、凭据架构、更新策略和验证计划,但不能声称模型防提取、运行时保护或性能兼容已经通过。

想用自己的 App 验证?

提交候选包、目标系统和关键业务路径,申请御盾 PoC 与兼容性评估。

继续阅读: 移动 AI 应用的运行时安全边界