Skip to content

安全

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 漏洞。
  • 内置字体经过审计、固定版本与内容寻址,不在运行时下载。

Terminality — 连接每个角落