对比
我们只在可验证的特性上对比 FOLD,并为每一列提供一个来源链接。竞品各列信息截至 2026 年 6 月;若厂商有所变更,本表会随之更新。
| 特性 | FOLD | Apple Mail | Mimestream | Spark | Thunderbird | Outlook(新版) |
|---|---|---|---|---|---|---|
| 无额外云端后台 | 是 | 是 | 是 直连 Gmail | 否 Readdle 云端 | 是 | 否 Microsoft 云端 |
| 启用 App Sandbox | 是 | 是 | 是 | 是 | 有限 标准安装未启用沙盒 | 是 |
| 原生 OpenPGP | 是 Ed25519、Curve25519 + RSA | 否 | 否 | 否 | 是 | 否 |
| 原生 S/MIME | 是 | 是 | 否 | 否 | 是 | 是 |
| 在客户端验证 DKIM | 是 | 否 | 否 | 否 | 附加组件 不在核心功能中 | 否 |
| 支持任意 IMAP 服务商 | 是 | 是 | 否 仅限 Gmail | 是 | 是 | 有限 强制经由 Microsoft 云端 |
| 开源 | 否 | 否 | 否 | 否 | 是 MPL 2.0 | 否 |
来源: Apple Platform Security · Mimestream 支持的账户 · Spark 隐私说明 · Thunderbird · 新版 Outlook 云同步(Cybernews,2023).
DKIM 一行指客户端独立验证(重新计算正文哈希和签名),而不仅仅是显示服务器端的 Authentication-Results 邮件头。截至 2026 年 6 月。
依赖策略
只有同时满足以下四项条件,才会接受第三方依赖:它提供了我们自己无法正确实现的原语 · 它来自可信来源 · 它可被审计 · 它列于下表中。
引擎和界面仅使用 Apple 系统框架。直接下载版在 App 外壳中额外加入了一个更新程序。
| 允许 | |
|---|---|
Foundation | Apple SDK。带 TLS 的流承载 IMAP 和 SMTP,包括在已建立的连接上执行的 STARTTLS。 |
CryptoKit | Ed25519, X25519, AES-GCM, SHA-2, HKDF. |
Security | 钥匙串、SecTrust、RSA,以及 macOS 上用于 S/MIME 的 CMS。 |
CommonCrypto | 用于 OCB 和 CFB 模式的 AES 分组密码。 |
AuthenticationServices | ASWebAuthenticationSession,用于 OAuth。 |
SQLite3 | 系统自带的 SQLite,外加一层轻量 Swift 封装。不用 GRDB,也不用 SQLite.swift。 |
WebKit | 经过加固的邮件渲染,关闭 JavaScript,采用严格的内容策略。 |
os.Logger | Apple SDK。 |
| Sparkle | 仅用于直接下载版,且仅在 App 外壳中:签名更新。不属于引擎或界面。 |
| 排除 | |
|---|---|
swift-crypto | CryptoKit 的跨平台版本,在 Apple 平台上并不需要。 |
libetpan, MailCore | C 语言封装;我们需要可审计的 Swift 代码。 |
| OpenPGP 库 | 采用自研的现代优先实现,而非庞大的遗留攻击面。 |
SwiftData, CoreData | 并非为每个邮箱 50 万封邮件而设计;改为直接使用 SQLite。 |
| 第三方 JSON、日志和网络库 | Foundation 和 os 已经足够。 |
密码学策略
非对称密码、AES-GCM、HKDF、SHA-2 和 Curve25519 来自 CryptoKit 和 Security.framework,分组密码来自 CommonCrypto。Apple 未提供的原语由 FOLD 自行实现,并对照参考实现逐字节验证:用于 Fortress 模式的 Argon2id 和 BLAKE2b、用于 OpenPGP 的 AES-OCB、用于 SCRAM 的 PBKDF2。认证标签和 SCRAM 服务器签名均以恒定时间比较。
OpenPGP:默认现代,旧算法受控
两条原则。生成时:采用 Ed25519 签名和 Curve25519 密钥协商(ECDH)的第 4 版密钥、带完整性校验的 AES-256(带 MDC 的 SEIPD v1)、SHA-256/512。读取以及向现有收件人写信时:额外支持 Security.framework 中的 RSA,读取时还支持 GnuPG 的 OCB 模式;加密数据仅在完整性校验有效时才被接受,否则邮件会被拒绝(EFAIL)。尚不支持:RFC 9580 中的第 6 版密钥和 AEAD 加密(SEIPD v2)。永久拒绝:CAST5、IDEA、Blowfish、3DES、MD5 和 SHA-1 签名,以及没有完整性保护的加密数据。私钥以 S2K 保护(AES-256),存放在与设备绑定的钥匙串保险库中。已对照真实的 GnuPG 检验。
S/MIME
在 macOS 上通过 Security.framework 的 CMS 接口实现,在 iOS 上通过基于 SecKey 和 SecTrust 的平台无关 CMS 实现:签名、验证、加密、解密。可导入 .p12 身份和收件人证书(.cer、.pem、.der),会收集已验证的签名邮件中的证书,信任评估由 SecTrust 完成。如果有效签名的证书地址与发件人不符,该签名会显示为不受信任。在 iOS 上,收件人证书从已验证的签名邮件中收集;手动导入随后推出。已对照 openssl 签名的测试样本检验。
TLS 默认设置
严格校验证书和主机名,不提供任何绕过途径。TLS 版本遵循 Apple 平台的默认设置。STARTTLS:FOLD 建立连接、请求升级,若服务器拒绝或升级失败则中止;升级前已缓冲的数据会被视为中间人攻击,连接随即终止。未加密的 IMAP 和 SMTP 一律拒绝。按账户的证书固定已在计划中,目前尚不可用。
认证
密码和 OAuth 令牌仅以 kSecAttrAccessibleWhenUnlockedThisDeviceOnly 保存在钥匙串中,绝不存入 UserDefaults 或 plist。OAuth 作为公共客户端通过 ASWebAuthenticationSession 运行,强制使用 PKCE(S256):二进制文件中不含客户端密钥,并发的令牌刷新会被合并。SMTP 优先使用带服务器签名校验的 SCRAM-SHA-256,其次是 CRAM-MD5、PLAIN 和 LOGIN;OAuth 账户使用 XOAUTH2。经单独同意后,可选择通过端到端加密的 iCloud 钥匙串同步 IMAP 和 SMTP 密码。OAuth 令牌、Fortress 和 PGP 机密永不离开设备。
日志策略
日志中不含个人数据、邮件内容、主题、地址、令牌或 Cookie,调试构建中也是如此,并由 lint 规则强制执行,违反即构建失败。允许记录的内容:连接事件(主机、端口、TLS 版本、延迟)、协议状态、错误类别。Mac 上的活动窗口(含同步步骤和 SMTP 会话记录)仅保存在内存中,上限 300 条,从不写入磁盘。
沙盒与 Hardened Runtime
macOS:App Sandbox 与 Hardened Runtime。授权项:出站网络连接、用户选择的文件、一个钥匙串访问组,以及用于可选同步的 iCloud 容器;入站连接已禁用。不绕过库验证。iOS:系统沙盒、钥匙串组和 iCloud 容器,不使用 App Groups。尚未公开的直接下载版仅增加一项例外,以便其更新程序安装更新。在 macOS 上通过 Developer ID 分发,另通过 App Store 分发。
Fortress 模式
可按账户选择启用的应用层加密。Argon2id 以你的密码短语和保存在钥匙串中的 32 字节盐值(m = 64 MiB,t = 3,p = 4)派生出一把只存在于内存中的 256 位主密钥;每个账户通过 HKDF-SHA-256 获得各自的密钥。AES-256-GCM 加密封存邮件头数据库的文本列和邮件缓存;Fortress 账户的全文搜索功能受限。自动锁定会在闲置后清除密钥;若开启了 App 锁定,App 转入后台时也会清除。Argon2id 和 BLAKE2b 为自研实现,已对照 RFC 9106 和参考工具验证。
Fortress 不是什么
它不能替代 OpenPGP 或 S/MIME:后者保护传输中的邮件,Fortress 保护本地副本。它无法防御已被攻破的内核或操作系统。它也不是匿名模式:IMAP 元数据仍会让服务器知道你在与谁通信。
威胁模型
防御措施已对照 MITRE ATT&CK(26 项技术)和 MITRE D3FEND 进行映射。每项技术都注明了 FOLD 的缓解措施;对于输入处理和渲染(鱼叉式钓鱼附件、MIME 炸弹、polyglot 文件、EFAIL 式数据外泄),还注明了覆盖它的测试。
测试策略
编译时即启用 Swift 6 严格并发检查和 ExistentialAny。截至 2026-09-22,共有超过 3,000 项自动化测试。Address、Thread 和 Undefined Behavior Sanitizer 作为本地发布关卡,在每次推送和每次发布前运行;我们有意不使用托管 CI。回归测试套件会重放历史上的邮件客户端 CVE(EFAIL、BadWinmail、iOS Mail 堆溢出)。五个 libFuzzer 目标覆盖 MIME、编码字、地址、邮件头块和 CMS,每次测试运行都会以 3,000 次变异重放语料库。
协调披露
发现了漏洞?请发邮件至 [email protected]。我们会在 72 小时内确认,并在发布修复时致谢。PGP 密钥可应要求提供;联系方式也发布在 /.well-known/security.txt(RFC 9116)中。