技术拆解
你没编译过的模型,凭什么信?

.oasr 模型包靠内容哈希锁定,目录清单靠 Ed25519 签名,任何一步异常即拒绝——这就是 OpenASR 的 fail-closed 拉取链。
你在本地跑的每一个模型,归根结底是别人在你没见过的机器上产出的一堆文件。对于任何宣称”离线转录”的工具,真正该问的不是”云端有没有在听”,而是”我凭什么相信这些权重”。OpenASR 给出的答案故意做得很小、很可检查:应用本身不携带任何模型权重,下载由唯一一个引擎负责,在任何东西落盘之前,必须先过两道独立的关——内容哈希锁定的模型包,和 Ed25519 签名的目录清单。
这两层机制容易混为一谈,所以值得先说清楚:.oasr 模型包是锁定(pinned)的,不是签名的——包里没有发布者签名,也没有嵌入密钥(包的内部结构是另一个话题)。真正承载 Ed25519 签名的是目录清单(catalog manifest)。信任从目录流向模型包,靠的是内容哈希;从目录流向你,靠的是一把硬编码的公钥。
没有任何东西会”自己出现”
分发包里不含任何模型权重——无论是应用还是 CLI,都是如此。openasr-core::pull 是唯一的下载与安装引擎,CLI 直接调用它。桌面版的设计也是同理:构建产物只打包 sidecar 二进制和 registry/catalog 元数据,daemon 和桌面端的 Models 页面将所有安装操作路由回同一个引擎,webview 自身不会下载任何产物。运行时的各个入口——transcribe、serve、batch、benchmark、实时转录、API——从不隐式拉取模型。想要把字节写到磁盘上,你得自己明确地说出来。
# 唯一认可的安装路径openasr pull qwen3-asr-0.6b# 解析目录 → 锁定包 URL → 校验 → 原子安装一条默认拒绝的链
下载完的模型包不允许直接运行,它必须按固定顺序通过一系列关卡:HTTPS 目录包 URL、锁定的包 URL 校验、大小与 sha256 匹配、Rust 侧的 GGUF 预检、运行时来源验证,最后在同目录下原子 rename 为已安装的包。每一步都是门禁,不是建议。运行时入口对远程 URL、目录路径、无效扩展名、缺失文件、无效运行时元数据、tensor/layout 预检失败——一律 fail closed。遇到任何意料之外的情况,默认行为是拒绝,而不是放行。
锁定,不是签名: 模型包的完整性来自目录条目中锁定的 sha256 和文件大小,加上加载前的 GGUF 预检。包本身没有发布者签名——密码学签名在上一层,在目录清单上。
签名挂在目录清单上
真正的签名在这里。目录清单使用 Ed25519(通过 ed25519_dalek)进行验证,签名方案版本为 CATALOG_SIGNATURE_SCHEMA_VERSION = 1,算法 ed25519,key id 为 openasr-catalog-v1,签名域为 openasr.catalog_manifest.v1。校验时使用一把硬编码的信任根公钥 92331f10…5105c2ad——就一把内置密钥,没有多签方案,生产环境也没有在线轮换密钥。
签名之外还有内容完整性校验。验证流程会重新计算目录的 sha256,不匹配则返回 CatalogShaMismatch。清单字段也有形状检查:catalog_sha256 必须恰好是 64 个小写十六进制字符,signature.value 必须恰好是 128 个十六进制字符。形状不对的清单在签名运算之前就会被拒绝。
模型包靠内容哈希锁定,目录靠一把密钥签名。两层机制互不信任对方的结论。
——摘自目录安全模型
反降级,但措辞要精确
签过名的清单也可能是过时的,所以目录带有一个 epoch。强制规则故意做得很窄:收到的 epoch 如果严格小于已存储的最高 epoch,就会以 EpochRollback 拒绝;epoch 0 无效。注意”严格小于”这个词——相等的 epoch 是被接受的,所以这是反降级(anti-rollback),而不是严格递增计数器。它阻止回退到更旧的目录,但不要求每次刷新都必须递增编号。
离线可以,但签名不能少
信任在离线状态下依然成立,但不会放松。一次成功的 HTTPS 拉取之后,OpenASR 会同时获取相邻的签名清单,验证签名,检查 epoch 反降级,校验 schema,然后把经过验证的原始内容——连同签名和当前接受的最高 epoch——写入本地缓存。如果下一次 HTTPS 请求失败,系统只会加载之前缓存的那份已签名清单。未签名的缓存仅在开发和内置资源流程中用于本地 file:// 或文件系统目录源时才被接受。在线信任源始终是 HTTPS 加签名;离线运行只是重放你已经验证过的证明,而不是凭空造一个新的。
写这篇文章时,以上这些还不是一个经过公证的安装器,也不是一个已发布、带校验和的正式版本——那些是未来的计划,当时还没有公开的应用构建可以指向。发表时真正存在的是一个更小的、可验证的东西:一个你能叫得出名字的下载引擎,一条默认拒绝的拉取链,一个被哈希锁定的模型包,和一份由你能在源码里读到的那一把密钥签名的目录。这足以回答”凭什么信这些权重”,而不需要你信谁的口头保证。
编者注(2026-07-04): OpenASR 0.1.0 已经发布:macOS arm64 和 Linux x86_64 的 CLI 提供带校验和的发行版(GitHub Releases,SHA256SUMS),macOS 桌面版已通过 Developer ID 签名和 Apple 公证。详见 OpenASR 0.1.0。