安全
Terminality 把 React / React Native 层视为不受信任的展示客户端。秘密永远不会跨越 Rust–JavaScript 边界。
信任边界
┌─ 不受信任 ────────────────┐ ┌─ 受信任(Rust)───────────┐
│ React / React Native │ │ 密码学 │
│ 渲染 ViewModel │ │ 凭据解析 │
│ 调用类型化命令 │ │ 主机密钥决策 │
│ 看不到私钥和密码 │ │ 文件操作与 PTY / ConPTY │
└───────────────────────────┘ └────────────────────────────┘- Tauri WebView 只加载打包资源,使用严格 CSP 与最小
core:default能力。 - 自定义 Tauri 命令暴露领域操作,而不是任意路径或进程执行。
- 公开 Session 绑定没有任意程序启动逃生口。
保险库密码学
静态记录加密
- 算法:XChaCha20-Poly1305
- 每条记录使用随机 24 字节 nonce
- AAD 包含记录 ID、类型、模式版本、修订与软删除状态
- 明文缓冲与派生密钥在使用后清零
导出归档
.sztvault 使用 Argon2id:64 MiB 内存、3 次迭代、4 路并行,派生 32 字节密钥。随机盐与版本化头都受 AEAD 认证;导入会在派生前拒绝不支持的参数。
密钥存储
- 桌面端:随机 256 位设备密钥进入 macOS Keychain、Windows Credential Manager 或 Linux Secret Service。
- 调试构建使用隔离的
development/数据目录,不访问系统凭据存储。 - 移动端将使用 iOS Keychain / Android Keystore。
一个共享 EncryptedVaultRepository 保存主机、QCS 历史、设置与快捷命令。SQLite 只接触认证加密信封,模式迁移只向前。
主机与凭据保护
- 主机名、标签、目录、RDP 选项与不透明凭据引用一起加密。
- 密码、私钥字节与口令从来不是公开 Host DTO 的字段。
- RDP 密码通过专用命令写入独立凭据记录,只返回不透明引用。
- SSH 主机可供 SSH / SFTP / Omini 共用;FTP 与 RDP 无法借用其他主机族的端点或凭据。
终端保护
| 保护 | 机制 |
|---|---|
| 禁止静默写剪贴板 | 禁用 OSC 52 |
| 多行粘贴 | 终端界面确认 |
| 命令编排器 | 64 KiB 上限、跨窗格明确确认、逐窗格结果 |
| 快捷命令 | 只填草稿,不隐式执行 |
| 有界输出 | 64 × 8 KiB 队列与 PTY 背压 |
| 关闭保护 | Unix 检查前台进程组,Windows 保守确认 |
| tmux 安全 | $id + 代际校验,拒绝服务重启后的复用 |
RDP 保护
- RDP 使用独立主机族与独立目标 / 网关凭据。
- 默认 NLA,旧式 TLS 需要明确开启。
- 首次连接审阅 SHA-256 叶证书;证书变化会重新触发审阅。
- 未编译剪贴板与驱动器通道。
- 连接代际拒绝过期完成、输入与帧。
本地文件保护
参见本地文件:相对描述符遍历、代际引用、三次身份校验、只进废纸篓删除与有界批处理。
日志与遥测
- 默认没有遥测或崩溃上传。
- 新诊断必须选择加入。
- 日志绝不能包含命令、终端输出、路径、主机名、秘密或原始保险库错误。
依赖策略
- 仅允许商业兼容许可,并由
cargo deny强制执行。 - CI 阻止高危与严重 npm 漏洞。
- 内置字体经过审计、固定版本与内容寻址,不在运行时下载。